C语言类型转换运算问题

有个bug调了我一个星期。发现一个很奇怪的问题,百思不得其解,请指教unsignedchara,b,c,d,e;a=0;b=251;c=(a-b)/4;d=a-b;e=d... 有个bug调了我一个星期。发现一个很奇怪的问题,百思不得其解,请指教
unsigned char a,b,c,d,e;
a=0;b=251;
c=(a-b)/4;
d=a-b;
e=d/4;
问c、d的运算结果多少?为什么?
谢谢
展开
 我来答
百度网友6fe74e2
2013-04-16 · TA获得超过6592个赞
知道大有可为答主
回答量:1973
采纳率:100%
帮助的人:228万
展开全部

这个问题有点麻烦

是这样的

虽然你声明了unsigned char a,b,c,d,e;

但实际上,在进行+-*/四则运算时,他实际上是当成整型变量int来处理的

先看a=0 这个没什么问题

b=251,如果是int类型的话:0000 0000 1111 1011(一共32位,我只写这几位)

但由于b是unsigened char类型,所以b各二进制位是1111 1011

好了,关键的地方来了

a-b==-251这时,他已经变成了int类型了,-251在计算机中的二进制表示(补码)

251 :0000 0000 0000 0000 0000 0000  1111 1011

251的反码:1111 1111 1111 1111 1111 1111 0000 0100加1:就是-251的表示

1111 1111 1111 1111 1111 1111 0000 0101

这就是-251在内存中的表示

好啦

这时把这个值赋给d,所以只留下最低8位   0000 0101,又是无符号数,明白了吧,就是5

所以d的值最后是5

c=(a-b)/4这儿

-251/4==-62(int类型)

-62在计算机中表示:

62:  0000 0000 0000 0000 0000 0000 0011 1110

反码加1:1111 1111 1111 1111 1111 1111 1100 0001+1

                 1111 1111 1111 1111 1111 1111 1100 0010

取最低8位给c赋值:

c :1100 0010

由于c是unsigned char 最高位也不是符号位,转成整数就是194

所以最后,c是194,d是5

xiahanvy
2013-04-16 · TA获得超过342个赞
知道小有建树答主
回答量:462
采纳率:0%
帮助的人:347万
展开全部
c=(a-b)/4;
好像会转成int 来计算 c = -62 ,然后再转回unsigned char -62(4294967234)[0xFFFFFFC2]
所以c 最后是0xC2 也就是194
d=a-b;
同理 d = -251(4294967045) (0xFFFFFF05)
d = 5;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
IT孤鹜
2013-04-16 · TA获得超过4197个赞
知道大有可为答主
回答量:3960
采纳率:71%
帮助的人:3510万
展开全部
靠。。。少看了一个减
c=-251/4=-62=256+(-62)=194
d=-251=256+(-251)=5
e=5/4=1
unsigned char 就是非负 他的范围是0-255

要是是负数 他会把他转换成0-255范围的
只要加256就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
被世界LJ
2013-04-16 · TA获得超过438个赞
知道答主
回答量:96
采纳率:0%
帮助的人:69.8万
展开全部
c=194,d=5。
c定义的类型是unsigned char 无符号字符,
所以c=(a-b)/4这条语句先计算(a-b)/4的值为-62
然后强制转换成unsigned char ,
-62的二进制为11000010,当强制转换之后就将符号位的1计算进去,
11000010 就是194。
同理得到d的值。
希望对你有帮助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
封视萌7
2013-04-16
知道答主
回答量:4
采纳率:0%
帮助的人:5427
展开全部
c = 194; d = 5;
负数在在内存上存储是有补码表示的
(a-b)/4 = -62;
-62 :
原码1011 1110
补码1100 0010 = 194;同理可以求出d。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chr1999
2013-04-16 · TA获得超过1056个赞
知道小有建树答主
回答量:2462
采纳率:0%
帮助的人:1225万
展开全部
看书上+/-*int强制提升
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式