为什么Java Integer.MIN_VALUE是-2 ^ 31而不是-2 ^ 31 + 1,就像c ++一样

时间:2014-10-26 23:16:50

标签: java c++ integer overflow

我正在检查Java文档,看到Integer.MIN_VALUE是-2 ^ 31:

  

保持int的最小值的常量可以是-2 ^ 31。

在C ++中,32位有符号整数“long”具有不同的MIN值:

  

LONG_MIN:long int -2147483647类型的对象的最小值   (-2 ^ 31 + 1)或更少*

我很困惑为什么他们不同以及Java如何得到-2 ^ 31?在Java中,如果一个整数有32位且第一位用于符号,则-2 ^ 31 + 1更符合逻辑,不是吗?

2 个答案:

答案 0 :(得分:2)

32位数中最高有效位的值是2 ^ 31,因为这在有符号整数中是负的,所以该值是-2 ^ 31。我猜C ++使用-2 ^ 31 + 1作为MIN_VALUE,因为这意味着它具有与MAX_VALUE相同的绝对值,即2 ^ 31-1。这意味着整数可以存储-MIN_VALUE,这在Java中不是这种情况(可能会导致一些有趣的错误)。

答案 1 :(得分:1)

C和C ++旨在使用1s或2s补码或带符号幅度的机器上的本机表示。使用2s补码,你得到的范围从-2 n 到2 n -1,与Java类似。否则你会丢失最多的负数并获得-0的表示。

在C ++中,只保证n(位数)至少为16,而Java保证它正好是32。