有个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
自动类型转换的问题
在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....