为什么,给定:
int a = ..., b = ... ;
这是不安全的:
a - b
但这是安全的:
a > b
通过安全我的意思是保证不会受到溢出的影响(我写的是Comparator
个。)
答案 0 :(得分:2)
比较a > b
本身就是安全的,因为a
和b
都没有改变。操作a - b
可能不安全,因为可能出现溢出。
但是,之前的溢出可能会影响稍后进行的此类比较a > b
的正确性。减去一个非常大的负数将导致溢出,因为结果可能小于原始数字(在数学中,减去负数应该增加原始数字),这意味着a > b
可能是意外的结果。 / p>
如果在a - b
中使用Comparator
,首先看起来它满足Comparator
的约定:返回小于零,等于零或大于零的数字如果该值小于,等于或大于另一个值。但只有在没有发生溢出的情况下才会这样。
如果a = 1000
和b = 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
进行时间比较......