KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
After reading this question on signed/unsigned compares (they come up every couple of days I'd say): Signed / unsigned comparison and -Wall I wondered why we don't have proper signed unsigned compares and instead this horrible mess? Take the output from this small program: #include <stdio.h> #define C(T1,T2)\ {signed T1 a=-1;\ unsigned T2 b=1;\ printf("(signed %5s)%d < (unsigned %5s)%d = %d\n",#T1,(int)a,#T2,(int)b,(a<b));}\ #define C1(T) printf("%s:%d\n",#T,(int)sizeof(T)); C(T,char);C(T,short);C(T,int);C(T,long); int main() { C1(char); C1(short); C1(int); C1(long); } Compiled with my standard compiler (gcc, 64bit), I get this: char:1 (signed char)-1 < (unsigned char)1 = 1 (signed char)-1 < (unsigned short)1 = 1 (signed char)-1 < (unsigned int)1 = 0 (signed char)-1 < (unsigned long)1 = 0 short:2 (signed short)-1 < (unsigned char)1 = 1 (signed short)-1 < (unsigned short)1 = 1 (signed short)-1 < (unsigned int)1 = 0 (signed short)-1 < (unsigned long)1 = 0 int:4 (signed int)-1 < (unsigned char)1 = 1 (signed int)-1 < (unsigned short)1 = 1 (signed int)-1 < (unsigned int)1 = 0 (signed int)-1 < (unsigned long)1 = 0 long:8 (signed long)-1 < (unsigned char)1 = 1 (signed long)-1 < (unsigned short)1 = 1 (signed long)-1 < (unsigned int)1 = 1 (signed long)-1 < (unsigned long)1 = 0 If I compile for 32 bit, the result is the same except that: long:4 (signed long)-1 < (unsigned int)1 = 0 The "How?" of all this is easy to find: Just goto section 6.3 of the C99 standard or chapter 4 of C++ and dig up the clauses which describe how the operands are converted to a common type and this can break if the common type reinterprets negative values. Bu
Tags (comma-separated)
Save Edits
Cancel