--- In [email protected], Paul Herring <pauljherr...@...> wrote: > > On Tue, Oct 20, 2009 at 5:40 PM, tallpaul2000 <pado...@...> wrote: > > range for int and an unsigned int MUST be at least [-32767,+32767] and > > [0,65535], respectively. > > This means they are minimum 16 bits wide. > > But can be wider on any particular implementation. > > > Similarly, looking at the spec for LONG_MIN, LONG_MAX, and ULONG_MAX, the > > standard says > > that a long and unsigned long MUST be minimum 32 bits wide. The standard > > makes no claim > > that they can't be wider, but seems _very_ clear on the minimum widths. > > > > However, when I look at <stdint.h>, > > ... on a specific implementation, where an int is 32 bits wide...
Ah - that was what I was missing. For some reason it did not occur to me that <stdint.h> has different implementations on different platforms. That resolves all my confustion - thanks! > > I see the following typedefs: > > ISO C99: 7.18 <stdint.h> > > typedef unsigned int uint32_t; > > typedef int int32_t; > > > > This has me scratching my head, because on platforms where an int is 16 > > bits wide > > you have a type called "int32_t" that contrary to its name is 16 bits wide! > > No, you have an integer _type_ that is 32 bits wide. > > > It seems to me the typedefs in <stdint.h> should be: > > typedef unsigned long uint32_t; > > typedef long int32_t; > > They probably are on an implementation that has 16 bit wide ints. > > > So then by the spec we are guaranteed that an int32_t will be at least 32 > > bits wide. > > But, an int32_t is supposed to be an int that _is_ 32 bits wide, not > _at_least_. > > You appear to be confusing char, int, long etc that have minimum > widths with the intxx_t that have exact widths. No, looking at the typdefs for intxx_t in <stdint.h>, you still have no guarantee of _exact_ widths, only minimums. As far as I can tell, the C99 spec only states minimum widths. Not really an important point, though. > > This seems to be a pretty serious error in terms of portability. > > Not at all. In fact quite the opposite. > > If you want a type that's _at_least_ 16 bits wide, use an int. If you > want an int that *is* 16 bits wise, use int16_t. > > > But given these typedefs have been in <stdint.h> for a long time they must > > be OK for some reason I can't see. > > > > Can somebody please shed some light on this for me? > > -- > PJH > > http://shabbleland.myminicity.com/ > http://www.chavgangs.com/register.php?referer=9375 > http://www.kongregate.com/?referrer=Shabble >
