Java 为什么Integer.MIN_值的负数给出相同的值?
考虑下面的java代码Java 为什么Integer.MIN_值的负数给出相同的值?,java,operators,bitwise-operators,ones-complement,Java,Operators,Bitwise Operators,Ones Complement,考虑下面的java代码 Integer value = Integer.MIN_VALUE; System.out.println(value); value = -value; System.out.println(value); 输出 -2147483648 -2147483648 Integer.MIN\u值的负值如何产生相同的值但是结果不能是2147483648,因为java中整数的最大值是2147483647 但是想知道为什么-2147483648?什么样的位操作在内部发生?当您
Integer value = Integer.MIN_VALUE;
System.out.println(value);
value = -value;
System.out.println(value);
输出-2147483648
-2147483648
Integer.MIN\u值的负值如何产生相同的值
但是结果不能是2147483648
,因为java中整数的最大值是2147483647
但是想知道为什么-2147483648
?什么样的位操作在内部发生?当您对-2147483648
求反时,它将解析为2147483648
,这超过了整数.MAX_值
,使用1
。然后该值再次溢出到Integer.MIN\u值
从:
整数类型有byte、short、int和long,它们的值是8位、16位、32位和64位带符号的两位补整数
因此,对一个整数所做的每一个一元运算实际上都会应用于两个数的补码表示。
当达到整数.MAX_值时,它将由一个前导0
和31个1
位组成。添加1
将使其成为一个前导为1
且尾随为31的0
s的数字,这实际上是Integer.MIN\u值的两个补码表示形式
什么样的位操作在内部发生
Java使用有符号数字的表示。因此,改变标志操作包括两个步骤:
反转原始值的位,以及
将1
添加到结果中
2147483648
的表示如下所示:
10000000000000000000000000000000
反转它会产生
01111111111111111111111111111111
添加1
使其再次成为相同的数字,即
10000000000000000000000000000000
由于整数溢出。为什么将其限制为正数作为输入?@laune我明白你的意思。编辑以避免混淆。@Codebender添加1
的结果大于int
可以容纳的最高正值,因此这是一个溢出。另一个nit:从技术上讲,将1添加到011…1不会导致n位加法器溢出,即在这种情况下不会设置进位标志。只有将第一位解释为符号位时才会产生“环绕”效果。@laune这是一个溢出,从某种意义上说,将设置为结果。当达到Integer.MAX_值时,它将由32个1位组成。添加1将使其成为一个33位的数字,前导为1,尾随为0。
-您弄错了。Integer.MAX_值是一个0后跟31 1位。向其中添加一个将导致1后跟31 0位,这是Integer.MIN_值的两个补码表示。对于重新打开的投票者,副本中的答案解释了Integer.MIN_值的否定。重复的问题不是关于相同的问题,而是关于这个问题,正如标签上所说,这里已经有了答案。