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

Why Java Integer.MIN_VALUE is -2^31 but not -2^31+1 like c++

本文关键字:c++ 31+1 Integer Java MIN 为什么 VALUE      更新时间:2023-10-16

我正在检查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更符合逻辑,不是吗?

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

C和C++旨在使用机器上的本机表示,使用1或2补码或有符号幅度。使用2s补码,您可以得到从-2n到2n-1的范围,与Java中的范围大致相同。否则,您将丢失最多的负数,并获得-0的表示形式。

在C++中,只保证n(比特数)至少为16,而Java保证它恰好为32。