Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Nov 2000 09:31:19 +0100
From:      bdluevel@heitec.net
To:        cjclark@alum.mit.edu, Salvo Bartolotta <bartequi@inwind.it>, freebsd-questions@FreeBSD.ORG
Subject:   Re: OT: curious (??) integer types behavio(u)r...
Message-ID:  <3A0FA6D7.38C88CF7@heitec.net>
References:  <20001112.21033200@bartequi.ottodomain.org> <20001112143032.Q75251@149.211.6.64.reflexcom.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Crist J . Clark wrote:
> 
> On Sun, Nov 12, 2000 at 09:03:32PM +0000, Salvo Bartolotta wrote:
[...]
> > <blockquote>
> > /* A simple test program */
> >
> > #include <stdio.h>
> >
> > main()
> >      {
> >            char c1 = -128;
> >            char c2 = 127;
> >            unsigned char c = 255;
> >
> >            short int si1 = -32768;
> >            short int si2 = 32767;
> >            unsigned short int si = 65535;
> >
> >            int d1 = -2147483648;
> >            int d2 = 2147483647;
> >            unsigned int d = 4294967295;
> >            unsigned long int l = 4294967295;   /* redundant */
> >
> >            printf("%d %d %d %d %d %d %d %d %d %ld\n", c1, c2, c, si1,
> > si2, si, d1, d2, d, l);
> >      }
> >
> > </blockquote>
> >
> > >====> cc -o mytest mytest.c
> > mytest.c: In function `main':
> > mytest.c:15: warning: decimal constant is so large that it is unsigned
> > mytest.c:17: warning: decimal constant is so large that it is unsigned
> > mytest.c:18: warning: decimal constant is so large that it is unsigned
> >
> >
> > >====> ./mytest
> > -128 127 255 -32768 32767 65535 -2147483648 2147483647 -1 -1
> >                                      (?)               ^^^^^^
> >
> >
> >
> > To sum up:
> > 1) cc complains about line 15, but the limit is correctly displayed by
> > the program (!);
> 
> Yeah, that is strange.

No, it's right. The line in question is
	int d1 = -2147483648;

But here, the number 2147483648 can't be represented by a signed 'int';
however, there is no L or U suffix so the programmer may well intend
such an 'int'. GCC correctly warns that an automatic conversion will be
applied, resulting in 2147483648U.

Note that the '-' sign doesn't help, it's not part of the number but an
operator that is applied to the number. So what's written is: Take the
'int' value 2147483648, then negate it, then store the result in the
freshly created int variable d1. Because the first step doesn't work,
it's in fact: take the 'unsigned int' value 2147483648, negate it,
convert that to 'signed int', then store the result in the freshly
created int variable d1. The 'conversion to signed' has
implementation-defined results by the way.

For extra fun, see the #define of INT_MIN in
/usr/include/machine/limits.h and the explaining comment above it.


[...]


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A0FA6D7.38C88CF7>