Java 为什么2^31不能存储在整数变量中,而-2^31可以?

Java 为什么2^31不能存储在整数变量中,而-2^31可以?,java,c++,Java,C++,整数变量为4字节或32位,二进制数中的2^31和-2^31均为32位。但是当你把2^31=2147483648放入一个整数变量时,它会显示一个错误,但是对于-2^31,它是可以的。为什么? 根据调查,我们得出: int:默认情况下,int数据类型是32位带符号2的补码整数,最小值为-2^31,最大值为2^31-1。在JavaSE8及更高版本中,可以使用int数据类型表示无符号32位整数,其最小值为0,最大值为2^32-1。使用Integer类将int数据类型用作无符号整数。有关更多信息,请参阅数

整数变量为4字节或32位,二进制数中的2^31和-2^31均为32位。但是当你把2^31=2147483648放入一个整数变量时,它会显示一个错误,但是对于-2^31,它是可以的。为什么?

根据调查,我们得出:

int:默认情况下,int数据类型是32位带符号2的补码整数,最小值为-2^31,最大值为2^31-1。在JavaSE8及更高版本中,可以使用int数据类型表示无符号32位整数,其最小值为0,最大值为2^32-1。使用Integer类将int数据类型用作无符号整数。有关更多信息,请参阅数字类一节。向Integer类添加了静态方法,如compareUnsigned、divideUnsigned等,以支持无符号整数的算术运算

从另一方面我们得到:

当一个整数有符号时,它的一个位成为符号位,这意味着该数字的最大值减半。因此,无符号32位int最多可以存储2^32-1,而其有符号对应项的最大正值为2^31-1

在Java中,除char外,所有整数类型都是有符号的

是因为第一位表示符号位。它可以存储的最大正值2^31-1。有许多资源可用于此

整数变量为4字节或32位,二进制数中的2^31和-2^31均为32位

不,他们不是

在基本二进制中,负数不是一回事。我们有零和一。没有任何迹象

在二进制中,2^31变为:

1000万

在二进制中,如果不先定义负数的存储方式,则不能表示-2^31

通常,java也会这样做,使用名为2的补码的系统。2的补码听起来很复杂:取数字,比如说5。在本练习中,用二进制表示它,我们使用字节,即8位:0000 0101。现在,翻转所有位:1111010,然后添加1:1111011

也就是有符号2的补码二进制中的-5

这个奇怪的系统有两个惊人的特性:数学继续正常工作,而不需要知道数字是有符号的还是无符号的。让我们试试看-5+2等于-3,对吗?让我想想。。1111011+0000 0010是多少?不用担心2的补码,我得到11111101。让我们应用2的补码转换:首先翻转位:0000 0010,然后添加1:0000 0011,这是。。。3.所以-5+2等于-3。检查另一个惊人的特性是它不会“浪费”0上2^32个插槽中的2个。让我们尝试0:0000 0000的2的补码,然后翻转所有位:1111111,然后添加1:0000 0000,并忽略位溢出。这很好:0是它自己的2的补码。我们无法区分0和-0,但这通常是件好事

该系统的另一个特性是第一位是“符号”位。如果为1,则为负;如果为0,则为负

让我们试着用2来补足1000万。首先,翻转位:0111111111111111111111111111111111111111111。然后加1:1000万。等待那是。。。我们所拥有的

是的。因为第一位是负数,所以1000万是负数

也许你忘记了0是一个事物,0既不是积极的也不是消极的

所以,如果0需要是可表示的,并且得到一个0符号位,则位中的零是0000000。。。当然,这意味着所有以0开头的可表示数字的一半中的“空格”现在变小了一个,因为0吃了一个槽。这意味着与正数相比,还有一个负数可以表示。或者,0“计数”为正数,因此0是第一个正数,-1是第一个负数。因此,在2的补码中必须至少有1个负数没有正等价物。那个号码是。。。2^31. -2^31适用于32位有符号+2^31没有

让我们想象一个3位带符号的数字,带有2的补码。我们可以列出它们:

000 = 0
001 = 1
010 = 2
011 = 3
100 = -4
101 = -3
110 = -2
111 = -1

注意-4是如何出现的,而+4不是,注意我们是如何涵盖8个数字的。2^3=8-3位可以表示8个数字,但不能超过8。

因为需要将0放在某个位置是的,正范围从0开始提示:用小数字更容易推理。8位可以存储-128到127(含),总共256个值。另一个提示:最高有效位是2的补码表示法中的符号位。设置该值时,数字为负数。