C语言类型转换运算问题
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
好像会转成int 来计算 c = -62 ,然后再转回unsigned char -62(4294967234)[0xFFFFFFC2]
所以c 最后是0xC2 也就是194
d=a-b;
同理 d = -251(4294967045) (0xFFFFFF05)
d = 5;
c=-251/4=-62=256+(-62)=194
d=-251=256+(-251)=5
e=5/4=1
unsigned char 就是非负 他的范围是0-255
要是是负数 他会把他转换成0-255范围的
只要加256就可以了
c定义的类型是unsigned char 无符号字符,
所以c=(a-b)/4这条语句先计算(a-b)/4的值为-62
然后强制转换成unsigned char ,
-62的二进制为11000010,当强制转换之后就将符号位的1计算进去,
11000010 就是194。
同理得到d的值。
希望对你有帮助
负数在在内存上存储是有补码表示的
(a-b)/4 = -62;
-62 :
原码1011 1110
补码1100 0010 = 194;同理可以求出d。