abs的bug

2019-10-04  本文已影响0人  0一缕星光0

在完成leetcode:783题时用到了

abs(Int.MIN_VALUE)

本以为应该返回Int.MAX_VALUE的,但是却仍然返回了Int.MIN_VALUE

println(Int.MIN_VALUE) 

// -2147483648

println(abs(Int.MIN_VALUE))

// -2147483648

探本溯源,发现在abs的源码里就有解释:

/**
 * Returns the absolute value of the given value [n].
 *
 * Special cases:
 *   - `abs(Int.MIN_VALUE)` is `Int.MIN_VALUE` due to an overflow
 *
 * @see absoluteValue extension property for [Int]
 */
@SinceKotlin("1.2")
@InlineOnly
public actual inline fun abs(n: Int): Int = nativeMath.abs(n)

还不满意,继续找:

/**/Android/sdk/sources/android-28/java/lang/Math.java
  * Note that if the argument is equal to the value of
  * {@link Integer#MIN_VALUE}, the most negative representable
  * {@code int} value, the result is that same value, which is
  * negative.
*/
public static int abs(int a) {
        return (a < 0) ? -a : a;
    }

终于在这里找到实现了,可是还不满意,仔细在分析下:
int的有效区间是[-2^{31}, 2^{31}-1],也就是[-2147483648,2147483647],这就意味着2147483648已经溢出了,相当于2147483647 + 1=Int.MAX_VALUE+1,而这个Int.MAX_VALUE在内存中是多少呢?

0b01111111_11111111_11111111_11111111

再给它加一是多少呢?

0b10000000_00000000_00000000_00000000

那么这个值是多少呢?答案就是Int.MIN_VALUE!!(这里涉及到补码
终于明白为什么这里会有一个StackOverFlow了!


参考:

上一篇 下一篇

猜你喜欢

热点阅读