有符号数和无符号数的比较
int a = -1;
unsigned int b = 1;
printf("%d", a > b);
输出结果为1。
分析:有符号数和无符号数比较时,会将有符号数转化为无符号数进行比较(比较的是两者的补码),故而a<b。
char a = -1;
unsigned char b = 1;
printf("%d", a > b);
输出结果为0。
分析:小类型之间进行数据比较时,会发生整型提升。a发生整型提升后,想当于int a=-1;b发生整型提升后相当于int b=1。所以这里的结果为a<b。
整型提升的规则如下:以char为例子,不管对于有符号char还是无符号char,我们都希望它发生整型提升后的值保持不变,比如 char a=-1,我们希望发生整型提升后a的值还是-1,又如 unsigned char b=1,我们希望发生整型提升后b的值还是1。故而整型提升的规则设计如下:
1)对于无符号unsigned char a=1,我们在它的前面全部填充0使之变为4个字节,这样发生整型提升后a的值仍然为1。
2)对于有符号char b=1,由于b为正数,所以我们在它的前面全部填充0使之变为4个字节,这样发生整型提升后a的值仍然为1。
3)对于有符号char c=-1,由于c为正数,为了保证c在发生整型提升之后值仍然为-1,那就只能在它的前面全部补1(32位bit数的模为2的32次方,所以想要求-1的补码,直接用2的32次方减去1即可,故而在前面全部补1是非常正确的)。
int a = -1;
unsigned char b = -1;
printf("%d\n", a < b);
输出结果为1。
分析:b存的是-1,从无符号数的角度去看,它的值为0xFF,发生整型提升后,b的类型实际上是有符号的int,而不是无符号int,所以这里不会发生有符号数和无符号数比较的情况。故而a<b。
char a = -1;
unsigned int b = -1;
printf("%d\n", a == b);
输出结果为1。
分析:a发生整型提升后其结果还是为int类型的-1,然后发生有符号数和无符号数比较的情况,两者补码相同,故而结果a==b。