gpt4 book ai didi

Kotlin - 带有溢出异常的类型转换

转载 作者:行者123 更新时间:2023-12-02 13:03:14 25 4
gpt4 key购买 nike

(123L).toInt() 产生 123Long.MAX_VALUE.toInt() 产生 -1。显然这是不正确的。无需编写大量样板代码,有没有办法让 Kotlin 在值超出目标类型的范围/界限时引发异常?

最佳答案

TL;DR 你可以创建一个自定义扩展函数来检查值是否在 Int.MIN_VALUE 和 Int.MAX_VALUE 之间

fun Long.toIntThrowing() : Int {
if (this < Int.MIN_VALUE || this > Int.MAX_VALUE) {
throw RuntimeException()
}

return this.toInt()
}

您观察到的“奇怪”行为正在发生,因为在 Kotlin 中,Long 表示为 64 位有符号整数,而 Int 表示为 32 位有符号整数。

虽然 123L 很容易用 32 位整数表示,但 Long.MAX_VALUE 会(几乎)两次溢出整数,导致您观察到的行为。

我相信下面的例子会更好地说明它:

    println((2147483647L).toInt()) // the max 32 bit signed int
println((2147483648L).toInt()) // 1 more overflows it to the min (negative) 32 bit signed int
println((2147483649L).toInt()) // 2 more...
println((Long.MAX_VALUE - 1).toInt())
println((Long.MAX_VALUE).toInt())

结果:

2147483647
-2147483648
-2147483647
-2
-1

发件人:https://discuss.kotlinlang.org/t/checked-and-unsigned-integer-operations/529/2

Exceptions on arithmetic overflow: this will likely make arithmetics significantly slower, and we don’t see how to avoid it without changes to the JVM, nor are we ready to accept the slowdown

关于Kotlin - 带有溢出异常的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55838532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com