C-同样的数据,为什么显示结果不一样?
#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);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
区别是由于a引起的。
signed char a = 0xe0;
char总共8位, 区间 0 到 255
但是signed char 是指带符号的char,同样是8位,最高位被用来表示正负号了,区间在-127到128。
0xe0用二进制表示是
11100000
但是在带符号的char中如果传入这个值,会被认为是-32的补码表示
(11100000,第一个1表示符号是负,原码是10100000)
至于b为什么是-32是因为a直接赋值给它的是补码。32位机int是32位,所以
unsigned int b
实际上被赋值为0xffffffe0
。在%d打印时,b被认为是负数而被转化打印输出。
其实,你要是以%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。
不知道这个解答能否接受。