为什么比较Java中的安全性?

时间:2013-09-05 21:17:09

标签: java integer-overflow

为什么,给定:

int a = ..., b = ... ;

这是不安全的:

a - b

但这是安全的:

a > b

通过安全我的意思是保证不会受到溢出的影响(我写的是Comparator个。)

2 个答案:

答案 0 :(得分:2)

比较a > b本身就是安全的,因为ab都没有改变。操作a - b可能不安全,因为可能出现溢出。

但是,之前的溢出可能会影响稍后进行的此类比较a > b的正确性。减去一个非常大的负数将导致溢出,因为结果可能小于原始数字(在数学中,减去负数应该增加原始数字),这意味着a > b可能是意外的结果。 / p>

如果在a - b中使用Comparator,首先看起来它满足Comparator的约定:返回小于零,等于零或大于零的数字如果该值小于,等于或大于另一个值。但只有在没有发生溢出的情况下才会这样。

如果a = 1000b = Integer.MIN_VALUE + 100(一个非常大的负数,-2147483548),那么a - b将会溢出。真正的数学结果是500 - Integer.MIN_VALUE,值大于Integer.MAX_VALUE(2147484548)。所以正回报值表示a > b,这显然是正确的。

但是在溢出的情况下,该值最终小于零(-2147482748),错误地指示a < b

答案 1 :(得分:1)

这取决于......请参阅System.nanoTime(),建议t1 - t0 < 0, not t1 < t0进行时间比较......