Java 为什么Integer.MIN_值的负数给出相同的值?

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?什么样的位操作在内部发生?当您

考虑下面的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
?什么样的位操作在内部发生?

当您对
-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_值的否定。重复的问题不是关于相同的问题,而是关于这个问题,正如标签上所说,这里已经有了答案。