c语言类型转换操作问题

这个问题有点麻烦。

那是真的

虽然你声明没有签名?夏尔?a、b、c、d、e;

但实际上在进行+-*/四则算术运算时,他实际上是把它当作一个整型变量int。

先看a=0?这没有错。

B=251,0000如果是int类型?0000?1111?1011(一共32个,我只写这些)

而是因为b未签名?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(整型)

-62在电脑里说:

62:?0000?0000?0000?0000?0000?0000?0011?1110

anticode plus 1:1111?1111?1111?1111?1111?1111?1100?0001+1

?1111?1111?1111?1111?1111?1111?1100?0010

取最低的8位给c赋值:

c?:1100?0010

因为c是无符号的?夏尔?最高有效位不是符号位,换算成整数就是194。

所以最后C是194,D是5。