关于类型转换时的“符号扩展”

刚才高健给了个小例子:

 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果然是求职利器呀!

有时间要多看!

posted on 2011-04-24 22:29  fte99923  阅读(388)  评论(0)    收藏  举报