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

发布于 2017-01-15 10:15:58 字数 262 浏览 1302 评论 2

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-05-23 03:23:15

区别是由于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被认为是负数而被转化打印输出。

清晨说ぺ晚安 2017-03-26 04:09:50

其实,你要是以%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。
不知道这个解答能否接受。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文