在完成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的有效区间是[-,
-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了!
参考:
- 补码 Android小码农
网友评论