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