一:整形截断问题
1.
分析:-128 的原码是 10000000 00000000 00000000 10000000
补码是 11111111 11111111 11111111 10000000,因为是char 型,截断之后:10000000
%u 是打印无符号整数,整形提升补截断之后的符号位1:11111111 11111111 11111111 10000000
被当做无符号整数对待,即原码就为:11111111 11111111 11111111 10000000
答案:
4294967168的二进值就是:11111111 11111111 11111111 10000000
2.
这题与上题一样的答案,大家可以试试自己分析。
二:整形之间加减运算
分析:a 在内存中存储的:00000000 00000000 00000000 00001010,因为是正数。
-20的原码是 10000000 00000000 00000000 00010100,
补码是 11111111 11111111 11111111 11101100,所以 b 里是补码,计算机中运算都是补码运算,将补码相加得到:11111111 11111111 11111111 11110110,%d 打印有符号整数,所以相加之后的补码变原码:10000000 00000000 00000000 00001010,所以是-10。%u打印无符号整数,所以相加之后的补码就被当作原码,直接打印。
答案:
三:无符号与有符号整形的范围
1.
这题是死循环,因为无符号unsigned int 永远都比 0 大
2.
这题我们就需要找到 0 的位置,也需要了解 char 类型的范围,因为只有一个字节8个位,还有一个符号位。当是正数的时候最大为:01111111,也就是127,如果是负数的话规定 char 最小的负数就是-128,所以 char 的范围:
所以答案就是 255。
如果是无符号 unsigned char 范围是多少?
因为无符号就不存在负数了。