i for (i == -i && i != 0) 的值在 Java 中返回 true

2022-08-31 10:19:09

我有以下情况。if

if (i == -i && i != 0)

在 Java 中,对于此条件,将返回什么值 ?itrue

我想不出在Java中考虑二进制补码符号的任何这种价值。i

我也希望有代数证明这个条件的任何答案(在Java的上下文中)?


答案 1

它唯一有效的值是 。intInteger.MIN_VALUE

这是因为整数是使用两者的补码方式否定的

System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));

你看那是Integer.MIN_VALUE

10000000000000000000000000000000

取负值是通过首先交换和 来完成的,这得到01

01111111111111111111111111111111

并通过添加 ,从而得到1

10000000000000000000000000000000

正如你在我给出的链接中看到的,维基百科提到了最负数的问题,并指定这是唯一的例外:

二的补数中负数最多的数字有时被称为“怪数”,因为它是唯一的例外。

当然,如果您将其存储在变量中,则会出现相同的现象。Long.Min_Valuelong

请注意,这只是由于在Java中对int的二进制存储所做的选择。例如,另一个(糟糕的)解决方案可能是通过简单地更改最重要的位并让其他位保持不变来否定,这将避免MIN_VALUE的这个问题,但会产生2个不同的值和复杂的二进制算术(例如,你会如何增加?)。0


答案 2

您要查找的值是 。Integer.MIN_VALUE


我也希望有代数证明这个条件的任何答案(在java的上下文中)?

这对于Stack Exchange来说是偏离主题的。但是你可以从Java整数的定义开始(JLS 4.2))

“整数类型是字节、短整型、整数型和长整型,其值为 8 位、16 位、32 位和 64 位有符号二进制补码整数......”

“积分类型的值是以下范围内的整数......对于 int,从 -2147483648 到 2147483647,包含”

和 Java 一元 '-' 运算符的定义 (JLS 15.15.4):

“对于整数值,否定与从零减除相同。Java 编程语言对整数使用二的补码表示,并且二的补码值的范围不是对称的,因此对最大负整数或长整型的否定会导致相同的最大负数。在这种情况下会发生溢出,但不会引发异常。对于所有整数值 x,-x 等于 (~x)+1。


推荐