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

if条件,我有以下几点。

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

Java的这个条件, i将返回什么样的值?

我无法想象任何这样的价值, i考虑在Java中使用二进制补码 。

我也喜欢有代数certificate这个条件有什么答案(与Java的背景下)?

它唯一的int值是Integer.MIN_VALUE

这是因为整数是用二的补码方式否定的 。

运用

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

你看到Integer.MIN_VALUE

 10000000000000000000000000000000 

取负值是通过先交换01来完成的

 01111111111111111111111111111111 

并加1 ,即给出

 10000000000000000000000000000000 

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

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

当然,如果将Long.Min_Value存储在一个longvariables中,您Long.Min_Value同样的现象。

请注意, 这只是由于在Java中进行了二进制存储的select 。 另一个(坏的)解决scheme可能是例如通过简单地改变最重要的位而使其他位不变,这样可以避免MIN_VALUE这个问题,但是会产生2个不同的0值和复杂的二进制算术(你会如何增加了例如?)。

您正在查找的值是Integer.MIN_VALUE


我也喜欢有代数certificate这个情况下的任何答案(与上下文中的Java)?

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

“整型是byte,short,int和long,它们的值是8位,16位,32位和64位带符号的二进制补码整数…”

“整数types的值是整数在以下范围内…对于int,从-2147483648到2147483647,包括”

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

“对于整数值,否定与零相减,Java编程语言对整数使用二进制补码表示,而且二进制补码值的范围不是对称的,所以最大负整数或长整数的否定结果就是相同的最大负数,在这种情况下发生溢出,但不会抛出exception,对于所有整数值x,-x等于(〜x)+1。

除了到目前为止给出的答案…

总共有四个值

 int i = Integer.MIN_VALUE; long i = Long.MIN_VALUE; Integer i = Integer.valueOf(Integer.MIN_VALUE); Long i = Long.valueOf(Long.MIN_VALUE); 

包装的值得到解包,所以它们也适用于这个expression式。

注意:Math.abs文件。

public static int abs(int a)

返回一个int值的绝对值。 如果参数不是负数,则返回参数。 如果论证是否定的,则返回否定论证。

请注意,如果参数等于Integer.MIN_VALUE的值,则表示最负的可表示的int值,结果是相同的值,即负值。

public static long abs(long a)

返回长整型值的绝对值。 如果参数不是负数,则返回参数。 如果论证是否定的,则返回否定论证。

请注意,如果参数等于Long.MIN_VALUE的值,即最负的可表示的长整型值,则结果为相同的值,即负值。

Math.abs可能会返回一个负数是令人惊讶的。 发生这种情况的原因可能是:a)在这些情况下,没有-MIN_VALUE的正值; b)执行-计算导致溢出。

还有一点值得注意的是,为什么不能Byte.MIN_VALUE,Short.MIN_VALUE不这样做。 这是因为-将types更改为int ,因此不会溢出。

Character.MIN_VALUE没有问题,因为它是0。

Float.MIN_VALUE和Double.MIN_VALUE有不同的含义。 这些是大于零的最小可表示值。 因此,它们具有不是自己的有效负面价值。

像其他人提到的一样,这只能通过Integer.MIN_VALUE实现。 至于certificate,让我提供一个比二进制更容易理解的解释(虽然它仍然扎根于此)。

请注意, Integer.MIN_VALUE等于-2^31-2147483648Integer.MAX_VALUE等于2^31-12147483647-Integer.MIN_VALUE2^31 ,现在对于Integer来说太大了(因为它已经超过了MAX_VALUE ),从而导致整数溢出,再次使其成为Integer.MIN_VALUE 。 这是唯一的整数,因为MIN_VALUE是除了0以外唯一没有负值的数字。

暂时的代数certificate,使用modulo 2^32算术:

i == -i可以重写为2 * i == 0 (在两侧添加i ),或者i << 1 == 0

该等式具有formsi == 0 >> 1两个解,即通过左移01得到的0b10000000000000000000000000000000b

解决schemei == 0被排除,仍然是解决schemei == 100000000000000000000000000000000b

也许这不是太教育,但不是认为你可以运行这个代码:

  for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) { if (i == -i && i != 0) { System.out.println(i); } } 

看到它打印

 -2147483648 -2147483648 

无限地 :)