C语言类型转换运算问题

有个bug调了我一个星期。发现一个很奇怪的问题,百思不得其解,请指教
unsigned char a,b,c,d,e;
a=0;b=251;
c=(a-b)/4;
d=a-b;
e=d/4;
问c、d的运算结果多少?为什么?
谢谢

这个问题有点麻烦

是这样的

虽然你声明了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

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-16
c=(a-b)/4;
好像会转成int 来计算 c = -62 ,然后再转回unsigned char -62(4294967234)[0xFFFFFFC2]
所以c 最后是0xC2 也就是194
d=a-b;
同理 d = -251(4294967045) (0xFFFFFF05)
d = 5;
第2个回答  2013-04-16
靠。。。少看了一个减
c=-251/4=-62=256+(-62)=194
d=-251=256+(-251)=5
e=5/4=1
unsigned char 就是非负 他的范围是0-255

要是是负数 他会把他转换成0-255范围的
只要加256就可以了
第3个回答  2013-04-16
c=194,d=5。
c定义的类型是unsigned char 无符号字符,
所以c=(a-b)/4这条语句先计算(a-b)/4的值为-62
然后强制转换成unsigned char ,
-62的二进制为11000010,当强制转换之后就将符号位的1计算进去,
11000010 就是194。
同理得到d的值。
希望对你有帮助
第4个回答  2013-04-16
c = 194; d = 5;
负数在在内存上存储是有补码表示的
(a-b)/4 = -62;
-62 :
原码1011 1110
补码1100 0010 = 194;同理可以求出d。
第5个回答  2013-04-16
看书上+/-*int强制提升

自动类型转换的问题
在C语言中,自动类型转换遵循以下规则:1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。3、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要...

在C语言中的类型转化原则是什么?
字符型—→整型—→长整型—→浮点型—→单精度型→双精度型 就是当字符型和整型在一起运算时,结果为整型,如果整型和浮点型在一起运算,所得的结果就是浮点型,如果有双精度型参与运算,那么答案就是双精度型了。强制转换是这样的,在类型说明符的两边加上括号,就把后面的变量转换成所要的类型了...

C语言中的类型转换
对于不同类型的运算,遵循一个原则:将类型级别较低的数据转换为较高级别的类型,以适应运算需求。例如,char与int运算结果为int。而char与long运算结果为long,int与long运算结果为long。浮点与整型运算结果为浮点类型。混合运算遵循相同原则。类型转换通常自动进行,确保运算顺利进行。转换依据类型级别,从低...

C语言强制类型转换怎么做?
首先,定义两个变量A和B,例如,A设为整型3,B设为整型5。接下来,定义一个目标变量C,用于存储可能需要转换后的结果。在执行除法运算C=A\/B时,如果直接进行,可能会遇到类型不匹配的问题,比如3除以5得到0.6。C语言默认会将小数结果转换为整数,即0。这可能导致预期结果不准确。为了进行正确的运算...

关于c语言中类型转换的题目
上面的x = 1.000000000000000 才对 补充:首先short是短整型,所占字节数是2(表示的范围为-32768~32767)bi是从16进制的长整型转换而来的,在内存中会截取后16位(0101011001111000)转化成10进制,即22136 至于第二个因为short和char都在long的表示范围内,相加即可,A的ASCII码为65,故c=1065 ...

C语言自动类型转换和强制类型都不会四舍五入吗
类型转换只会“舍”而不会“入”,也就是舍去小数部分。例如一个浮点型值为3.999,经类型转换到int型后值为3。但楼下说C语言没有四舍五入的概念,这是错误的。某些情况下程序会进行四舍五入,例如格式化输出时。以%a.bf(a和b都是数字)输出时,系统将对b+1位进行四舍五入,然后输出保留...

C语言类型转换运算问题
是这样的 虽然你声明了unsigned char a,b,c,d,e;但实际上,在进行+-*\/四则运算时,他实际上是当成整型变量int来处理的 先看a=0 这个没什么问题 b=251,如果是int类型的话:0000 0000 1111 1011(一共32位,我只写这几位)但由于b是unsigened char类型,所以b各二进制位是1111 1011 好了,...

在c语言中int long unsigned 和 char这四种类型数据的转换规律是...
本题中,数据类型级别由低到高分别为:char→int→unsigned→long。转换时由低级别向高级别转换。比如,有两个数的数据类型分别为:char型跟long型。 就要先char转换为long型(因为long级别比char高),再进行运算。但是不能理解为:先将char转换成int,再转换成unsigned,再转换成long。C语言是一种...

C语言强制类型转换问题我的代码没有问题吧dev c++还是提醒了错误_百 ...
你这样转法是没错。报的错误是精度丢失。说明你的系统下int *占用字节数比int大。你改成强转长整型(long)。

C语言强制类型转换问题
据我了解,以及据我测试,这两种情况的输出应该都是0.000000 因为你的a定义的是int类型,所以1\/a和1\/2并没有不同,计算结果都是0.5再取整,就变成了0.0。如果你定义为double类型,那就是0.5,转成double还是0.5 一般C语言中,整数如果要使用浮点数计算,需要加个小数,比如1\/2,应该改为1....

相似回答
大家正在搜