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 型)也是同样的道理,只不过位数更多,存储范围更大而已。
数据溢出等基础性问题都是面试官喜欢考的基础题。