From: Matthias Andree (no email)
Date: Tue Sep 02 2003 - 07:35:33 EDT
-----BEGIN PGP SIGNED MESSAGE-----
(Wietse Venema) writes:
> Here's something that appears to work better:
I'm afraid that it's broken here:
> printf("%lld\n", MAXINT(off_t));
this call assumes that off_t is a long long, but that's not true.
Did I hear someone say that the printf interface was error prone?
This just demonstrated itself again.
The fix is to cast the argument to long long to unbreak this printf
line. (code below)
On systems where sizeof (off_t) != sizeof (long long), re-run the
corrected version and post your results:
#include <sys/types.h>
#include <limits.h>
#include <stdio.h>
#define MAXINT(T) ((T) (((T)1 << ((sizeof(T) * CHAR_BIT) - 1) ^ ((T) -1))))
main()
{
printf("char %d %x\n", MAXINT(char), MAXINT(char));
printf("short %d %x\n", MAXINT(short), MAXINT(short));
printf("int %d %x\n", MAXINT(int), MAXINT(int));
printf("long %ld %lx\n", MAXINT(long), MAXINT(long));
printf("ssize_t %lld %llx\n", (long long)MAXINT(ssize_t), (long long)MAXINT(ssize_t));
printf("off_t %lld %llx\n", (long long)MAXINT(off_t), (long long)MAXINT(off_t));
printf("long long %lld %llx\n", MAXINT(long long), MAXINT(long long));
printf("sizeof long long: %d, sizeof off_t: %d\n", sizeof(long long), sizeof(off_t));
}
> It would be nice to hear how this works on 64-bit systems. I can
> try this on SPARC/Solaris myself.
Sun Workshop complains: warning: integer overflow detected: op "<<",
seems harmless though.
> Up to this point I think I understand how and why the macro works.
>
> However, if someone can explain to me why this produces 0xffffffff
> for long long on I386, then I am all ears. Every day brings an
> opportunity to learn something new about the C programming language.
The corrected version above doesn't do that (FreeBSD 4.9-PRERELEASE,
SuSE Linux 8.1), see below. Sun cc is WorkShop 6 update 1 C 5.2 2000/09/11
Solaris 8 USPARC III SunPro v7 (32bit) code (Sun cc, gcc 3.2.2):
char 127 7f
short 32767 7fff
int 2147483647 7fffffff
long 2147483647 7fffffff
ssize_t 2147483647 7fffffff
off_t 2147483647 7fffffff
long long 9223372036854775807 7fffffffffffffff
sizeof long long: 8, sizeof off_t: 4
Solaris 8 USPARC III SunPro v7 (32bit) code (Sun cc, gcc 3.2.2)
WITH -D_FILE_OFFSET_BITS=64 (see lfcompile(5)):
char 127 7f
short 32767 7fff
int 2147483647 7fffffff
long 2147483647 7fffffff
ssize_t 2147483647 7fffffff
off_t 9223372036854775807 7fffffffffffffff
long long 9223372036854775807 7fffffffffffffff
sizeof long long: 8, sizeof off_t: 8
Solaris 8 USPARC III SunPro v9 (64bit) code (Sun cc, gcc 3.2.2):
char 127 7f
short 32767 7fff
int 2147483647 7fffffff
long 9223372036854775807 7fffffffffffffff
ssize_t 9223372036854775807 7fffffffffffffff
off_t 9223372036854775807 7fffffffffffffff
long long 9223372036854775807 7fffffffffffffff
sizeof long long: 8, sizeof off_t: 8
FreeBSD 4.9-PRERELEASE i386 (gcc 2.95.3 + FreeBSD patches "2.95.4"):
char 127 7f
short 32767 7fff
int 2147483647 7fffffff
long 2147483647 7fffffff
ssize_t 2147483647 7fffffff
off_t 9223372036854775807 7fffffffffffffff
long long 9223372036854775807 7fffffffffffffff
sizeof long long: 8, sizeof off_t: 8
SuSE Linux 8.1 i386 (glibc 2.2.5, gcc 3.2):
char 127 7f
short 32767 7fff
int 2147483647 7fffffff
long 2147483647 7fffffff
ssize_t 2147483647 7fffffff
off_t 2147483647 7fffffff
long long 9223372036854775807 7fffffffffffffff
sizeof long long: 8, sizeof off_t: 4
SuSE Linux 8.1 i386 with -D_FILE_OFFSET_BITS=64 (glibc 2.2.5, gcc 3.2):
char 127 7f
short 32767 7fff
int 2147483647 7fffffff
long 2147483647 7fffffff
ssize_t 2147483647 7fffffff
off_t 9223372036854775807 7fffffffffffffff
long long 9223372036854775807 7fffffffffffffff
sizeof long long: 8, sizeof off_t: 8
- --
Matthias Andree
Encrypt your mail: my GnuPG key ID is 0x052E7D95
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)
iQCVAwUBP1SAiCdEoB0mv1ypAQGsRgQAwVby6UW1CuppdBA1Uvi1m6ivHpOTKUM/
84W49XYAo9DDYXMnDVXneiGiuIlM2OMr56QP8jpIi9hnpl0hDeTqU7bCg34Nizh+
DpJaIpxBhZkqf1bAtlkfBw7Chd0P+ltgW62zZaLJv8E98XtDDeL+52+BHmoOou3R
2SBwudTB+AM=
=zzGj
-----END PGP SIGNATURE-----
|
|
|