我有以下if
条件。i(i == -i && i!= 0)的值在Java中返回true
if (i == -i && i != 0)
什么价值的i
将返回true
在Java这种状况呢?
考虑到two's complement在Java中的表示法,我无法想象任何这样的值i
。
我也喜欢有这种情况的任何答案的代数证明(与Java的背景下)?
我有以下if
条件。i(i == -i && i!= 0)的值在Java中返回true
if (i == -i && i != 0)
什么价值的i
将返回true
在Java这种状况呢?
考虑到two's complement在Java中的表示法,我无法想象任何这样的值i
。
我也喜欢有这种情况的任何答案的代数证明(与Java的背景下)?
唯一int
值。
使用
System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));
你看到Integer.MIN_VALUE
是
10000000000000000000000000000000
以负值时,首先交换0
和1
完成,这给
01111111111111111111111111111111
,并通过添加1
,这给出了
10000000000000000000000000000000
正如你在我给的链接看到,维基百科提到这个问题最负数,并指定它是唯一的例外:
在补最负数有时被称为“奇怪的数字“,因为它是唯一的例外。
当然你有Long.Min_Value
同样的现象,如果你将其存储在long
变量。
请注意,这只是由于有关Java中inint的二进制存储作出的选择。例如,另一个(坏)解决方案可以通过简单地改变最重要的位并使其他位不变来实现否定,这可以避免MIN_VALUE的这个问题,但是会产生2个不同的0
值和复杂的二进制算术(你会如何例如增加?)。
您要查询的值是Integer.MIN_VALUE
。
我也很想有任何回答这个条件有(JAVA中)的代数证明?
这是Stack Exchange的主题。但你可以做到这一点从Java整数定义(JLS 4.2)
“积分类型有byte,short,int和长,其值是8位,16位,32位开始和64位有符号二进制补码整数...“
和
”整型的值是在下列范围内... 对于int整数,从 - 21474836 48至2147483647,包容 “
和Java一元的定义中 ' - ' 运算符(JLS 15.15.4):
” 对于整数值,否定是与从零减法。 Java编程语言对整数使用二进制补码表示,并且二进制补码值的范围不是对称的,因此否定最大负整数或长整数将导致相同的最大负数。在这种情况下发生溢出,但不会引发异常。对于所有的整数值X,-X等于(〜X)+1。”为它的工作原理是
Integer.MIN_VALUE
。这是因为整数使用two's complement way否定
像其他人提到的一样,这只能通过Integer.MIN_VALUE
来实现。至于证明,让我提供一个比二进制更容易理解的解释(虽然它仍然植根于此)。
注意Integer.MIN_VALUE
等于-2^31
或-2147483648
Integer.MAX_VALUE
和等于或2^31-1
2147483647
。 -Integer.MIN_VALUE
是2^31
,现在对整数来说现在太大了(因为它已经过去了MAX_VALUE
),从而导致整数溢出,从而使它再次成为Integer.MIN_VALUE
。这是,这是否唯一的整数。由于MIN_VALUE
是没有负面相当于只数除了0
@dystroy实际上我正在寻找一些解释,根据Mark的说法,在int范围内没有+2147483648这样的数字,所以第一个疑问应该是除0以外的这个数字。范围是-2^n到2^n-1 。所以没有-2^n的正面对应物。这只是另一个可能的int值。 – Sunny
我没有在二进制文件中解释过,因为它已经被别人覆盖了(基本上int是一个32位值,这就是为什么它有这些限制)。此外,负面的消极是积极的,所以这些条款仍然适用。 –
在Java中奇怪的是,编号'2147483648'只能在一种情况下出现在源代码中:作为一元减运算符(JLS 3.10.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);
四个值
包装的值得到解包,所以它们也适用于此表达式。
注意:Math.abs文件。
公共静态INT ABS(INT一)
返回一个int值 的绝对值。如果参数不是负数,则返回参数。如果 参数是否定的,则返回否定参数。
注意,如果该参数等于Integer.MIN_VALUE, 表示的最小负int值的值,结果是相同值 ,其为负。
和
公共静态长ABS(长)
返回long值的绝对值。如果参数不是 否定的,则返回参数。如果参数是否定的,则返回参数的否定结果 。
注意,如果参数等于Long.MIN_VALUE,所述 最负表示的长值的值,结果是相同的值, 且为负。
令人惊讶的是,Math.abs可能会返回负数。发生这种情况的原因可能是a)在这些情况下没有-MIN_VALUE的正值b)执行溢出的-
计算结果。
还有什么值得注意的是为什么不By_MIN_VALUE,Short.MIN_VALUE不这样做。这是因为-
将这些类型更改为int
,因此没有溢出。
Character.MIN_VALUE不会有问题,因为它是0
Float.MIN_VALUE和Double.MIN_VALUE有不同的含义。这些是大于零的最小可表示值。因此,他们有有效的负面价值观,而不是他们自己。
感谢彼得,这是我们已有的答案的良好扩展.. – Sunny
我想知道Byte.MIN_VALUE和其他可能性,您的答案提供了。谢谢 –
暂定代数证明,使用modulo 2^32
算术:
i == -i
可以改写为2 * i == 0
(添加两侧i
),或i << 1 == 0
。
此方程具有如下形式i == 0 >> 1
,即0b
和10000000000000000000000000000000b
通过在任一0
或1
左侧移位获得的两种解决方案。
排除解决方案i == 0
,仍然存在解决方案i == 100000000000000000000000000000000b
。
怎么样,如果(我!= null) – zxc
是指?我是参考? – Sunny
请注意,'-0.0'也是'== 0' –