为什么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++
我正在检查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。
相关文章:
- 打印方式:11 21 31
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 将74位整数转换为以31为底的整数
- 在 Flashdevelopment OpenFL 中编译需要 31 分钟
- 为什么int i = 1<<31 == -2147483648而不是2147483648?
- 如何将大型二进制文件(10000k 位)转换为基数 3 或基数 31?
- 错误:二进制表达式('float' 和 'float')返回的无效操作数 (x & (1 << 31)) == 0
- affdex.cpp:9:31:致命错误:pybind11/pybind11.h:没有这样的文件或目录 #include < pybind11/pybind11.h>
- 将2^31指定为浮点或双精度
- 为什么将 int a=1 移到左 31 位然后向右移 31 位,它变成 -1
- 这是Zeller程序的代码.除了1111年2月31日、1111年6月31日这一通常是错误的日期外,一切都很顺利
- 编写一个函数,将0-15位复制到16-31
- 我想显示序列 ftom 16 到 31 十进制数,但它没有显示:谁能在这里帮助我
- 哪种数据类型可以容纳10^31的十进制数
- 内部名称的前 31 或 63 个字符至少很重要
- 将2^31赋给有符号和无符号的32位整数变量后的奇怪结果
- 为什么Java Integer.MIN_VALUE是-2^31,而不是像c++那样的-2^31+1
- 为什么我在第31行的代码中有警告
- 为什么 1 << 31 在 C++14 中更改为实现定义?
- 1<<31产生误差;'<<'表达式未定义”;