C语言在处理无符号数时,将有符号数强制类型转换为无符号数进行运算。
这种行为对一般的算术运算没有影响,比如
1 int a=-10; 2 unsigned b=12; 3 printf("%d ",a+b); 4 printf("%u ",a+b);
运行结果
但是对于比较运算符(>,<,==),就会产生一些问题。
比如
1 int a=-1; 2 unsigned b=1; 3 printf("%d ",a<b?1:0);
我们期望的结果是-1<0,输出为1
实际运行结果
比较过程中,有符号数-1被强制类型转换为无符号类型,在32位的机器上,ua=a+pow(2,32);所以ua>>b
2.21 答案
类型 求值
无符号 1
有符号 1
无符号 0
有符号 1
无符号 1