#include <stdio.h>
int main()
{
int a = -1;
unsigned int b = 10;
if (a < b)
{
printf("It's OK!\n");
}
else
{
printf("%u %d\n", a - b, a - b);
}
return 0;
}
在C语言中要特别注意类型的隐式转换,如上代码,a为int类型,b为unsigned int,根据表达式的类型转换原则,a < b中,先将a转换为unsigned int类型。因为计算机存储数值采用二进制补码形式,架设a为一个4位的有符号整数,那么其二进制补码为1111,转换为unsigned int类型,a的十进制为15。同理此时a的值为4294967295(这和-1差得可是千山万水!),显然a > b。所以执行else,在printf("%u %d\n", a - b, a - b);中,a - b的计算过程的类型转换和上文提到的a < b是一致的,但是因为占位符%d和 %u的存在,输出的结果不一致,前者为4294967285,后者为我们想要的正确结果-11,为什么会这样呢?本来按照转换规则,a -b的计算结果应该为4294967285(unsigned int类型),但是%d让结果转换为int类型,那么就是-11,也就是我们得到的正确值。