为什么Java整数中的整数不使用全部32位或64位?

Jee*_*hah 1 java 64-bit 32-bit twos-complement

我正在研究32位和64位.我注意到可以存储在32位中的整数值范围是,±4,294,967,295但Java int也是32位(如果我没有记错的话),它存储的值最多为±2 147 483 648.同样的事情long,它存储来自0 to ±2^63但是64位存储±2^64值的值.为什么这些价值观会有所不同?

seh*_*seh 5

Java中的整数是有符号的,因此保留一位来表示该数字是正数还是负数.该表示称为"二进制补码表示法".通过这种方法,由n位表示的最大正值由下式给出

(2 ^(n - 1)) - 1

相应的最小负值由下式给出

- (2 ^(n - 1))

正面和负面界限的"一个一个"方面归因于零.零占用一个槽,留下偶数个负数和奇数个正数.如果您将表示的值描绘为钟面上类圆形小时的标记 - 您将看到零更多地属于正范围而不是负范围.换句话说,如果您将零视为正数,则会在正值和负值范围内找到更多对称性.

要学习这种表示,从小处开始.比方说,取三位,写出所有可以表示的数字:

  • 0
  • 1
  • 2
  • 3
  • -4
  • -3
  • -2
  • -1

你能写出定义每个数字的三位序列吗?一旦你理解了如何做到这一点,再尝试一下.从那里,你可以想象它如何扩展到32位或64位.

该序列形成一个"轮子",其中每个都是通过向前一个添加一个而形成的,并且从3到-4表示环绕.环绕效应(也可以通过减法发生)称为"模数对称".