main() {
if ( -1 < (unsigned char) 1 )
printf("less than");
else
printf("NOT less than");
}
打印“less than”。因为(unsigned char) 1
被转换为(signed char) 1
,然后:(signed) -1 < (signed) 1
,因此输出为less than
。但是,如果我将上面的代码更改为if ( (-1 < (unsigned int) 1 )
,那么输出结果就是NOT less than
。因此很明显,当我将unsigned char更改为unsigned int时:(signed) -1被转换为unsigned int [正好相反],由于-1存储为1的2's补码;比特模式被评估为255(可能),因此255 < 1将计算为false并执行else语句。即使你在'-1'的位置上替换int a = -1;
也会得到同样的结果。问题: 1.在有符号和无符号算术中...如何确定有符号值将被转换为无符号值还是反之? 2.为什么unsigned char和char之间的转换与unsigned int和int之间的转换不同:显然,unsigned被转换为signed,并且signed int和int:显然,signed被转换为unsigned。
PS:我知道这不是编译器相关的..所以不要说它是。