我正在研究 32 位和 64 位。我注意到可以存储在 32 位中的整数值的范围是,±4,294,967,295
但 Javaint
也是 32 位的(如果我没记错的话),它存储的值高达±2 147 483 648
. 同样的事情long
,它存储来自0 to ±2^63
但 64 位存储值的±2^64
值。为什么这些价值观不同?
3 回答
Java中的整数是有符号的,所以保留一位来表示数字是正数还是负数。该表示称为“二进制补码表示法”。使用这种方法,由n位表示的最大正值由下式给出
(2 ^ ( n - 1)) - 1
相应的最小负值由下式给出
-(2 ^ ( n - 1))
正边界和负边界的“一对一”方面是由于零。零占用一个槽,留下偶数个负数和奇数个正数。如果您将表示的值描绘为圆圈上的标记(如钟面上的小时),您会发现零更多地属于正范围而不是负范围。换句话说,如果您将零算作某种正数,您会发现正值和负值范围内的对称性更高。
要学习这种表示,从小处着手。比如说,取三个位并写出所有可以表示的数字:
- 0
- 1
- 2
- 3
- -4
- -3
- -2
- -1
你能写出定义每个数字的三位序列吗?一旦你了解了如何做到这一点,再尝试一下。从那里,您可以想象它是如何扩展到 32 或 64 位的。
该序列形成一个“轮子”,每个轮子都是通过在前一个上加一个而形成的,并带有从 3 到 -4 的明显环绕。这种环绕效应(减法也可能发生)称为“模算术”。
在 32 位中,您可以存储 2^32 个值。如果您将这些值称为 0 到 4294967295 或 -2147483648 到 +2147483647,则取决于您。这种差异称为“有符号类型”与“无符号类型”。Java 语言仅支持int
. 其他语言对于无符号 32 位类型有不同的类型。
没有语言将具有±4294967295的32位类型,因为“-”部分需要另一个位。
那是因为 Javaint
是有符号的,所以你需要一个符号位。