预备知识
1.等比数列求和公式
2.二进制转十进制
1111 1111
= 1*
2
7
2^7
27+1*
2
6
2^6
26+1*
2
5
2^5
25+1*
2
4
2^4
24+1*
2
3
2^3
23+1*
2
2
2^2
22+1*
2
1
2^1
21+1*
2
0
2^0
20
=1*(1-
2
8
2^8
28)/(1-2)=
2
8
2^8
28-1=255
3.char类型占据1个字节,有8位二进制数,首位为符号位
- 对于正数,符号位为0
- 对于负数,符号位为1
4.反码
- 正数的反码与其原码相同,0111 1111 ->0111 1111
- 负数的反码是对正数逐位取反,符号位保持为1, 1111 1111 ->1000 0000
5.补码
- 正数的补码与其原码相同,0111 1111 ->0111 1111
- 负数的补码为其反码在最低位加1,1111 1111 ->1000 0000->1000 0001
解释
char有8位,除去符号位,还剩7位。
-
正数
0*** ****
能表示的最大范围:
0 000 0001~0 111 1111
1* 2 6 2^6 26+1* 2 5 2^5 25+1* 2 4 2^4 24+1* 2 3 2^3 23+1* 2 2 2^2 22+1* 2 1 2^1 21+1* 2 0 2^0 20= 2 7 2^7 27-1=127 -
零
由于首位为符号位,因此决定数值大小的只有后7位,
因此0 000 0000和1 000 0000分别表示+0和-0.
但这样用两个二进制数来表示一个数是多余的,
因此我们用0000 0000来表示0,而1000 0000来表示 -128
那为什么是-128呢?
因为-128的原码是1 1000 0000,反码是1 0111 1111,补码是1 1000 0000
但char只保留8位,溢出最高位,
所以是1000 0000,也就是前面的-0,因此可以用1000 0000表示-128.
我们用补码运算来检验一下,
1000 0000(-128)+
0000 0001(1)
=(1000 0001)
取补1111 1111=-127,正确 -
负数
1111 1111~1000 0001+1000 0000
即为-128~-1
总结
综上所述,char类型的取值范围为-128~127
其他数据类型以此类推
特别的,对于unsigned类型(无符号数据类型)
其取值范围可以直接用[0,
2
n
2^n
2n-1](n为二进制数的个数)表示
问题
-128+(a<0)时,超出了char类型的范围,无法正确表示
这一点我们会在后面继续探讨。