From mboxrd@z Thu Jan 1 00:00:00 1970 From: Timothy Writer To: "Michael H. Warfield" Cc: GMurray@cware.co.uk (Graham Murray), gnu-win32@cygnus.com Subject: Re: long long vs long Date: Thu, 23 Jul 1998 15:30:00 -0000 Message-id: References: <199807221508.LAA12504@alcove.wittsend.com> X-SW-Source: 1998-07/msg00505.html "Michael H. Warfield" writes: > Graham Murray enscribed thusly: > > This is probably a silly question, but rather than having long long for > > 64 bit, why was long not made 64bit? The standard (AFAIK) states that > > short <= int <= long. So, it should be possible for long to be 64 bit > > rather than 32. This would give a simple progression from 8bit chars to > > 64bit longs. > > Unfortunately the standard also specifies the length of several > types. Specifically char is 8 bits, short is 16 bits, and long is 32 bits. The standard says no such thing. In section 5.2.4.2.1 Sizes of integral types , it says The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives.... Their implementation defined values shall be EQUAL or GREATER [emphasis mine] in magnitude (absolute value) to those shown, with the same sign. -- number of bits for smallest object that is not a bit field (byte) CHAR_BIT 8 .... -- minimum value for an object of type short int SHRT_MIN -32767 -- maximum value for an object of type short int SHRT_MAX +32767 .... -- minimum value for an object of type int INT_MIN -32767 -- maximum value for an object of type int INT_MAX +32767 .... -- minimum value for an object of type long int LONG_MIN -2147483647 -- maximum value for an object of type long int LONG_MAX +2147483647 The first paragraph clearly states that these values are implementation defined and that the sample values are suitable minimums. Furthermore, in section 6.1.2.5 the Standard states, "There are four signed integer types, designated as signed char, short int, int, and long int." It then goes on to say, "In the list of signed integer types above, the range of values of each type is a subrange of the values of the next type in the list." In other words, sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) and sizeof(char) == 1 sizeof(short) >= 2 sizeof(int) >= 2 sizeof(long) >= 4 While I agree that there is a large body of code that assumes long is 32 bits, such code is not portable. And not because of a flaw in the Standard, but because the programmer(s) responsible either didn't know the above or didn't care. -- Tim Writer Tim.Writer@ftlsol.com FTL Solutions Inc. Toronto, Ontario, CANADA - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request@cygnus.com" with one line of text: "help".