【发布时间】:2018-05-07 06:25:20
【问题描述】:
为什么"b23c77126dd924bf".toLong(16) 产生java.lang.NumberFormatException ??
截至official docs,Long "表示一个 64 位 有符号 整数"
而0xb23c77126dd924bf适合64位,是十进制-5603472915319675713
【问题讨论】:
标签: kotlin
为什么"b23c77126dd924bf".toLong(16) 产生java.lang.NumberFormatException ??
截至official docs,Long "表示一个 64 位 有符号 整数"
而0xb23c77126dd924bf适合64位,是十进制-5603472915319675713
【问题讨论】:
标签: kotlin
这里的问题是,如果您没有在 Kotlin 文字前显式添加 - 符号,则始终假定该文字代表一个正数。所以这里 0xB23C77126DD924BF 不是根据它的二进制补码表示来解释的,如果你假设它是一个 64 位有符号整数,它会给你 -5603472915319675713。它被解释为 12843271158389875903,超出了 Long 支持的范围。
这与Java Integer.MAX_VALUE vs Kotlin Int.MAX_VALUE 是同一个问题,但这里它与 Long 而不是 Int 有关。
【讨论】:
它的工作。使用 BigInteger
val numb = "b23c77126dd924bf"
val res = BigInteger(numb, 16)
println(res) //12843271158389875903
println(res.toLong()) //-5603472915319675713
【讨论】: