关于类型转换时的“符号扩展”
刚才高健给了个小例子:
char a=0xA5;
printf("%d\n",i);
输出的结果是-91,问为什么?
一开始的时候没想明白,如果是“8位二进制数”,那么0xA5按补码来算,确实是-91
可是printf的%d要打印的是32位的整数,8位补充到32位,为什么还是-91?
后来和秦多铎一起翻了下CSAPP教材,在50页找到答案:
位数的扩展分为“0扩展”和“符号扩展”,这道题属于“符号扩展”的范畴,即填充的位与“符号位”相同:
0xA5(1010,0101)扩展成32位是在1后边添加24个1,即1,1.....1(24个1),010,0101,补码正好是-91。
记得南大小百合上的那个神贴说得没错,CSAPP果然是求职利器呀!
有时间要多看!
浙公网安备 33010602011771号