为什么,给定:
int a = ..., b = ... ;
这是不安全的吗:
a - b
但这是安全的:
a > b
安全的意思是保证不受溢出的影响(我正在写一Comparator
整数)。
比较a > b
本身是安全的,因为a
和b
都不会更改。 操作a - b
可能不安全,因为可能会溢出。
但是,以前的溢出可能会影响以后a > b
进行的此类比较的正确性。 减去一个非常大的负数将导致溢出,因为结果可能小于原始数字(在数学中,减去负数应该增加原始数字),这意味着a > b
可能是意外的结果。
如果在Comparator
中使用a - b
,起初它看起来满足Comparator
的契约:如果值小于、等于或大于另一个值,则返回一个小于零、等于零或大于零的数字。 但这只有在不发生溢出的情况下才是正确的。
如果a = 1000
和b = Integer.MIN_VALUE + 100
(一个非常大的负数,-2147483548
),那么a - b
将溢出。 真正的数学结果是500 - Integer.MIN_VALUE
,一个大于Integer.MAX_VALUE
(2147484548)的值。 所以正返回值将表明a > b
,这显然是正确的。
但是对于溢出,该值最终小于零(-2147482748
),错误地指示a < b
。
嗯,这取决于...请参阅 System.nanoTime(),它建议t1 - t0 < 0, not t1 < t0
进行时间比较...