"Mark D. Baushke" <[EMAIL PROTECTED]> writes: > Bruno Haible <[EMAIL PROTECTED]> writes: > >> Mark D. Baushke wrote on 2005-11-15: >> > it would be more portable to use this: >> > >> > #ifndef SIZE_MAX >> > # define SIZE_MAX ((size_t)-1) >> > #endif >> > >> > because ((size_t)-1) will work even if size_t is narrower than int. >> >> Yes. As explained on 2005-07-11, I prefer to write this as >> ((size_t)~(size_t)0) >> because this way we don't need to refer to ISO C 99 6.3.1.3.(2). > > Hmmm... let me see. > > ISO C 99 6.3.1.3.(2) says: > | 2 Otherwise, if the new type is unsigned, the > | value is converted by repeatedly adding or > | subtracting one more than the maximum value that > | can be represented in the new type until the > | value is in the range of the new type. 49) > | > | 49) The rules describe arithmetic on the > | mathematical value, not the value of a given > | type of expression. > > I guess I didn't see the ISO C 99 reference in the > 2005-07-11 posting. Perhaps, I didn't find the one > you referenced...
I don't understand why ((size_t)-1) is considered C99 specific. Here is the equivalent paragraph from C90, numbered 3.2.1.2.(2) and .(3): When a signed integer is converted to an unsigned integer with equal or greater size, if the value of the signed integer is nonnegative, its value is unchanged. Otherwise: if the unsigned integer has greater size, the signed integer is first promoted to the signed integer corresponding to the unsigned integer; the value is converted to unsigned by adding to it one greater than the largest number that can be represented in the unsigned integer type. /22/ When an integer is demoted to an unsigned integer with smaller size, the result is the nonnegative remainder on division by the number one greater than the largest unsigned number that can be represented in the type with smaller size. ... 22. In a two's-complement representation, there is no actual change in the bit pattern except filling the high-order bits with copies of the sign bit if the unsigned integer has greater size. Thus, ((size_t)-1) is also the maximum value of size_t in C90. Am I misunderstanding some argument here? -- Ben Pfaff email: [EMAIL PROTECTED] web: http://benpfaff.org _______________________________________________ bug-gnulib mailing list bug-gnulib@gnu.org http://lists.gnu.org/mailman/listinfo/bug-gnulib