char 类型的数据占一个字节,一个字节有 8 位,最高位为符号位,1表示负数,0表示正数。在计算机中,数据用补码表示,正数的补码是它本身,负数的补码为 “符号位不变,其他位取反后再加1”。
0000 0011 表示 3。
0000 1011 表示 11。
-9 如何用机器码表示?
第一步先把 9 转换成二进制:1001;
第二步加上符号位,以存储到 char 类型的数据中为例,共有 8 位,最高位为符号位:1000 1001;
第三步符号位不变,其他位取反:1111 0110;
第四步加 1 :1111 0111;
最终,-9 的机器码为 1111 0111。
char 类型的数据存储的机器码范围为0000 0000 到 1111 1111。
其中 0000 0000 到 0111 1111 表示正数范围 0 到 127;
1000 0000 到 1111 1111 表示负数范围 -128 到 -1。
-127 的机器码为 1000 0001 (127 的二进制为 111 1111,最高位加上符号位 1111 1111,符号位不变其他位再取反 1000 0000,最后再加一得到机器码 1000 0001)。
-128 的机器码就是 -127 机器码减一:1000 0000。
数据溢出
当数据的大小超出或小于数据的存储范围后,就会产生不符合常理的结果,称之为数据溢出。
char 类型的数据存储范围为 -128 ~ 127,赋值或运算后超出这个范围,就会产生数据溢出。

127加1后理应是128,输出结果却为-128,如果从二进制的角度考虑,就没有什么疑问可言了:127的二进制为 0111 1111,加1后 1000 0000 就是 -128 的机器码。
unsigned char 无符号char数据类型,没有最高位符号位,数据存储范围为 0 ~ 255。

255 二进制为 1111 1111,加一后进位舍去变为 0000 0000。

其他数据类型(如 int 型)也是同样的道理,只不过位数更多,存储范围更大而已。
数据溢出等基础性问题都是面试官喜欢考的基础题。



















