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
存储在一个long
variables中,您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
无限地 :)