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
取负值是通过先交换0和1来完成的
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或-2147483648 , Integer.MAX_VALUE等于2^31-1或2147483647 。 -Integer.MIN_VALUE是2^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两个解,即通过左移0或1得到的0b和10000000000000000000000000000000b 。
解决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
无限地 :)