Java 为什么这个代码会打印两个负数?

Java 为什么这个代码会打印两个负数?,java,Java,结果: a=-2147483648 | b=-2147483648 我希望b是一个正数。更改整数的符号。最小值产生溢出;你正在看到结果。如果你曾经做过这样的事情: int a = Integer.MIN_VALUE; int b = -a; System.out.println("a = "+a + " | b = "+b); 您将知道,当某个值超过数据类型的最大值时,它将返回其最小值。当它小于最小值时,它会循环回最大值 同样的事情也发生在这里 从数学上讲,对int的最小值求反会得到21474

结果:

a=-2147483648 | b=-2147483648


我希望b是一个正数。

更改
整数的符号。最小值产生溢出;你正在看到结果。

如果你曾经做过这样的事情:

int a = Integer.MIN_VALUE;
int b = -a;
System.out.println("a = "+a + " | b = "+b);
您将知道,当某个值超过数据类型的最大值时,它将返回其最小值。当它小于最小值时,它会循环回最大值

同样的事情也发生在这里

从数学上讲,对int的最小值求反会得到2147483648,但因为它比最大值大一个。它再次循环回最小值,即-2147483648


有趣的事实:否定基本上是将每一位从0切换到1,从1切换到0,然后添加一位。尝试对100000000000000000000000执行此操作,这是int的最小值在二进制中的样子。

通常,当我们尝试将一个值分配给大于int类型的最大值的int类型时,它会再次从int的最小值开始环回,例如

int a = Integer.MAX_VALUE;
a++;
System.out.println(a);
a
的第一个语句后值为
-2147483648

当你做
intb=-a通常
b
应该有

2147483648 -will become-> -2147483648
2147483649 -will become-> -2147483647
2147483650 -will become-> -2147483646

但是int的最大正值是
2147483647
2147483648
2147483647
大一倍,它将通过
1
循环,并变为
-2147483648

,对于基本的二进制解释,这是因为有符号整数是以

因此,二进制中的最大负数是1000 0000。若要反转符号,请翻转所有位,然后添加一个

1000 0000=>0111111+1=1000 0000

你又回到了起点

如上例所示,字节(8位)的有符号范围为−128到127,所以-(-128)是128,这是127的1,所以它溢出回到-128


至于为什么要用二的补语呢?1-1变为1+(-1)或0001+1111=0000。所以通过将负数存储在二的补码中,减法是通过只取第二个数的二的补码并将它们相加来完成的。(对于机器来说,这比向算术逻辑单元(ALU)中添加一个减法电路要有效得多;因为它已经具有按位not和加法进行两次补码)。

因为最大正数要小一个。它考虑了0,正数值和负数值一样多。整数的最大值是2147483647,所以它循环回到最小值。如果你给
a
b赋值给
b
,它应该可以工作。基本上,这是一个两个补码的怪癖。考虑<代码>字节< /代码>类型,值从-128到127…如果一个字节
x
的值为-128,那么
-x
的值是多少?每个程序员都必须知道两位补运算。此外,文档中还介绍了数字类型的格式和范围。如果您希望
b
为正数,那么您希望的正数是多少?鉴于
Integer,您为什么希望如此。MAX_VALUE
为2147483647?
b = -a --> -(-2147483648) --> 2147483648