同样的数据,为什么显示结果不一样?


   
  #include <stdio.h>
  
void main(){

signed char a = 0xe0;
unsigned int b = a;
unsigned int c = 0xe0;
unsigned char d = a;
printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);
}

//output:a=-32,b=-32,c=224,d=224
a,b,c,d存储的应该都是补码形式1110 0000,但为何printf("%d")打印出来的只却不一样。尤其是

   
  unsigned int b = a;
  
unsigned int c = 0xe0;

这两句,为什么一个是-32,一个是224.难道存储的内容不一样吗?
对这块儿有点晕,希望能给个详细解答,谢谢

c 存储

nacui7 11 years, 2 months ago

其实,你要是以%x打印出16进制的话,更好理解点。16进制打印结果如下:
a=ffffffe0,b=ffffffe0,c=e0,d=e0,而你的printf打印格式如下:
a=%d,b=%d,c=%d,d=%d,也就是说,abcd你均按有符号int型打印,那么结果就显而易见的了,前两个值相同且符号位为1,故为负数,取反加1得其原码-32;后两个值相同且符号位为0,故为正数,补码即为其原码224.
你的问题,b和c的存储内容确实不一样。原因也很明显,b = a,a 是一个signed char型,而b是unsigned int型,这里就涉及到类型转换了,看看你们的谭浩强教材第60页,可以看见,需要在高位不1,故b就是0xffffffe0了,而unsigned int c = 0xe0;是一个简单的常理赋值,直接拷贝在低内存块,高位果断补0即可,故为0x000000e0。
不知道这个解答能否接受。

早安I.st answered 11 years, 2 months ago

Your Answer