incorrect enum warning?
Stefan Farfeleder
stefan at fafoe.dyndns.org
Thu May 1 15:16:40 PDT 2003
On Thu, May 01, 2003 at 02:43:26PM -0700, Mike Hunter wrote:
> On May 01, "Erik Trulsson" wrote:
>
> > On Thu, May 01, 2003 at 11:03:40PM +0200, Dag-Erling Smorgrav wrote:
> > > Stefan Farfeleder <stefan at fafoe.dyndns.org> writes:
> > > > Because 0x80000000 > INT_MAX on 32-Bit architectures, 0x80000000 has
> > > > type unsigned. But enumeration constants always have type int, that's
> > > > why you're getting this warning.
> > >
> > > but 0x80000000 == INT_MIN on 32-bit two's complement systems...
> >
> > No. 0x80000000 has type unsigned int (assuming 32-bit int) and is thus
> > a large positive number. INT_MIN has type signed int and is a negative
> > number. The fact that they happen to have the same representation does
> > not mean they are the same thing.
>
> #include <stdio.h>
> #include <limits.h>
>
> int main ()
> {
> printf("%d\n", (0x80000000 == INT_MIN));
> return 0;
> }
>
> ./a.out
> 1
>
> Just pointing out that they do "==" each other, which is what was said.
That is because the comparison is done in unsigned arithmetics due to
the "usual arithmetic conversions". The negative int value INT_MIN is
converted to unsigned int by adding UINT_MAX + 1 before the comparison
is evaluated.
Regards,
Stefan Farfeleder
More information about the freebsd-hackers
mailing list