以4字节的有符号int为例,4字节占32bit,取值范围是[-2147483648,2147483647]。问什么正数和负数的取值范围会不一样呢?
32bit,我们去掉一个符号位,还有31bit,231=2147483648,去掉全0的情况,则为
2147483647,那么不应取值范围是[-2147483648,2147483647]吗?
其实,在符号位为0(正)和1(负)时其余位为全0的含义是不同的。我们知道0是不包含正负的,在符号位为0时全0,表示的是数值0。而在符号位为1时,全0表示的是一个负数2147483648,所以负数范围也就比正数范围多1个。
取值 | 对应的bit |
---|---|
0 | 0000 0000 0000 0000 0000 0000 0000 0000 |
-2147483648 | 1000 0000 0000 0000 0000 0000 0000 0000 |
-
所以32bit被划分为:
- 正数,[0000 0000 0000 0000 0000 0000 0000 0001, 0111 1111 1111 1111 1111 1111 1111 1111],也即是[1, 2147483647]
- 负数, [1000 0000 0000 0000 0000 0000 0000 0001, 1111 1111 1111 1111 1111 1111 1111 1111]再加上1000 0000 0000 0000 0000 0000 0000 0000,也即是[-2147483647,-1]再加上-2147483648,最后也就是[-2147483648,-1]
- 0,对应0000 0000 0000 0000 0000 0000 0000 0000。
注:Java没有任何无符号类型(unsigned)。