2013-07-22 65 views
100

我有以下if条件。i(i == -i && i!= 0)的值在Java中返回true

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

什么价值的i将返回true在Java这种状况呢?

考虑到two's complement在Java中的表示法,我无法想象任何这样的值i

我也喜欢有这种情况的任何答案的代数证明(与Java的背景下)?

+2

怎么样,如果(我!= null) – zxc

+1

是指?我是参考? – Sunny

+4

请注意,'-0.0'也是'== 0' –

回答

125

唯一int值。

使用

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

你看到Integer.MIN_VALUE

10000000000000000000000000000000 

以负值时,首先交换01完成,这给

01111111111111111111111111111111 

,并通过添加1 ,这给出了

10000000000000000000000000000000 

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

在补最负数有时被称为“奇怪的数字“,因为它是唯一的例外。

当然你有Long.Min_Value同样的现象,如果你将其存储在long变量。

请注意,这只是由于有关Java中inint的二进制存储作出的选择。例如,另一个(坏)解决方案可以通过简单地改变最重要的位并使其他位不变来实现否定,这可以避免MIN_VALUE的这个问题,但是会产生2个不同的0值和复杂的二进制算术(你会如何例如增加?)。

+1

谢谢,你只知道它或任何逻辑可以应用? – Sunny

+2

值得注意的是,早期的二进制计算机确实使用了上一段中描述的整数的符号和幅度实现; IEE754浮点数也是如此。 http://en.wikipedia.org/wiki/Signed_number_representations#Sign-and-magnitude_method –

+1

回复:“这只涉及到关于整数的二进制存储的选择”:以及如何处理溢出的选择。 Java使用的规则与(例如)C所使用的规则或(比如说)标准ML使用的规则不同,尽管所有这些规则都运行在各种各样的系统上。 – ruakh

25

您要查询的值是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否定

+3

_Long.MIN_VALUE_。 – Juvanis

+1

这是100000 ..,如果我得到2的赞美它,它再次是011111 ... + 1 = 100000 ...但你知道它的顶部或我们可以应用任何逻辑? – Sunny

+1

正如我已阅读..java的诠释算术是算术mod 2power32,所以我想如果我们可以在1或2行证明这个价值..如果它是一个大的证明..然后没有问题。 – Sunny

14

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

注意Integer.MIN_VALUE等于-2^31-2147483648Integer.MAX_VALUE和等于或2^31-12147483647-Integer.MIN_VALUE2^31,现在对整数来说现在太大了(因为它已经过去了MAX_VALUE),从而导致整数溢出,从而使它再次成为Integer.MIN_VALUE。这是,这是否唯一的整数。由于MIN_VALUE是没有负面相当于只数除了0

+2

@dystroy实际上我正在寻找一些解释,根据Mark的说法,在int范围内没有+2147483648这样的数字,所以第一个疑问应该是除0以外的这个数字。范围是-2^n到2^n-1 。所以没有-2^n的正面对应物。这只是另一个可能的int值。 – Sunny

+1

我没有在二进制文件中解释过,因为它已经被别人覆盖了(基本上int是一个32位值,这就是为什么它有这些限制)。此外,负面的消极是积极的,所以这些条款仍然适用。 –

+1

在Java中奇怪的是,编号'2147483648'只能在一种情况下出现在源代码中:作为一元减运算符(JLS 3.10.1)的操作数。 –

18

在附加到目前给出的答案...

有总

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有不同的含义。这些是大于零的最小可表示值。因此,他们有有效的负面价值观,而不是他们自己。

+3

感谢彼得,这是我们已有的答案的良好扩展.. – Sunny

+1

我想知道Byte.MIN_VALUE和其他可能性,您的答案提供了。谢谢 –

6

暂定代数证明,使用modulo 2^32算术:

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

此方程具有如下形式i == 0 >> 1,即0b10000000000000000000000000000000b通过在任一01左侧移位获得的两种解决方案。

排除解决方案i == 0,仍然存在解决方案i == 100000000000000000000000000000000b

0

也许这不是太教育性,但不是想你可以运行此代码:

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

地看到,它打印

-2147483648 
-2147483648 

无限:)

+0

你怎么认为它是无限的? – JBelter

+0

因为我<= Integer.MAX_VALUE永远不会是假的 – Kuba

+1

啊,非常真实,我以为我严格看到'<' – JBelter

相关问题