为什么在 Java 中比较整数是安全的



为什么,给定:

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

这是不安全的吗:

a - b

但这是安全的:

a > b

安全的意思是保证不受溢出的影响(我正在写一Comparator整数)。

比较a > b本身是安全的,因为ab都不会更改。 操作a - b可能不安全,因为可能会溢出。

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

如果在Comparator中使用a - b,起初它看起来满足Comparator的契约:如果值小于、等于或大于另一个值,则返回一个小于零、等于零或大于零的数字。 但这只有在不发生溢出的情况下才是正确的。

如果a = 1000b = 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进行时间比较...

最新更新