由于 这篇写的太误导人,虽然不能说瞎扯,但至少还算可以理解,所以重新解释下“为什么int8的取值范围是[-128, +127]”
int8占1个字节,1字节(byte)占8位(bit)
其中最高位代表符号位 1-负号;0-正号
那么最大(正)数值的二进制为:
0 1 1 1 1 1 1 1
换算成10进制为 从低位到高位开始计算
0 1 1 1 1 1 1 1
+ 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0
+ 64 + 32 + 16 + 8 + 4 + 2 + 1 = +127
同理:最小(负)数值的二进制为:
1 1 1 1 1 1 1 1
换算成10进制为 从低位到高位开始计算
1 1 1 1 1 1 1 1
- 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0
- 64 + 32 + 16 + 8 + 4 + 2 + 1 = -127
但是,朋友们,注意了:
本来int8最高位是符号位,正数和负数的绝对值最大都为127,就如上述计算的结果,也就是正数最大为+127,负数最小为-127,但是这样的话就会出现两个0,也就是 +0和-0,所以才将-0 二进制表示:10000000)
规定为-128,所以范围为-128到+127(其中+0表示0),另外主要原因是与计算机底层以补码形式储存数据也比较相关,就是保证计算合理性,比如正1+负1=0,也就是:
十进制: +1 + -1 = 0
原码: 0000 0000 + 1000 0001 =>
补码: 0000 0000 + 1111 1111 = 0000 0000 => 0
参考:https://blog.csdn.net/ordmeng/article/details/99620804