Tom Lane said:
I suppose that clang's check must be calibrated to allow stuffing an unsigned value into a signed value of the same width, just not narrower widths.
Three things to note about this sort of stuff in C: (1) The range of values of an unsigned type has to include all the non-negative values of the corresponding signed type, but doesn't have to be any bigger. In other words, INT_MAX == UINT_MAX is allowed. (2) Just because two types with the same signedness have the same size as given by sizeof, they don't have to have the same range of values. So even if sizeof(int) == sizeof(long), INT_MAX != LONG_MAX is still allowed. (3) Just because two types have the same size, signedness, and range of values, doesn't mean they have the same representation. For example, int could be big-endian and long little-endian. -- Clive D.W. Feather | If you lie to the compiler, Email: clive@davros.org | it will get its revenge. Web: http://www.davros.org | - Henry Spencer Mobile: +44 7973 377646