在kotlin中将字符串转换为int有一个问题
converting a string to int in kotlin There is a problem
为什么结果是地雷?
我的问题是在 kotlin 中将字符串转换为 int。
class Test{
val x="200000000"
val y="11"
}
fun main(){
val test=Test()
println(test.x.toInt())
println(test.y.toInt())
val z=(Integer.parseInt(test.x))*(Integer.parseInt(test.y))
//or :val z=(test.x.toInt())*(test.y.toInt())
println(z)
}
结果:
200000000
11
-2094967296
您正在目睹 integer overflow。
Int
在 Kotlin 中(如 Java)表示 32 位有符号整数,因此它们的最大值为 2,147,483,647。
您要做的是将 200,000,000 乘以 11,得到 2,200,000,000 - 大于最大值。所以只有该数字的最低有效位可以存储在整数的 32 位中,而你最终会在负数中的某个地方。
如果你想达到这种值,你应该使用 UInt
(无符号整数,可以高两倍),Long
(64 位,因此可以达到高得多)或其他更复杂的类型,如 BigInteger
.
这里有一个 Long
的例子:
val x = "200000000"
val y = "11"
val z = x.toLong() * y.toLong()
println(z) // 2200000000
为什么结果是地雷? 我的问题是在 kotlin 中将字符串转换为 int。
class Test{
val x="200000000"
val y="11"
}
fun main(){
val test=Test()
println(test.x.toInt())
println(test.y.toInt())
val z=(Integer.parseInt(test.x))*(Integer.parseInt(test.y))
//or :val z=(test.x.toInt())*(test.y.toInt())
println(z)
}
结果:
200000000
11
-2094967296
您正在目睹 integer overflow。
Int
在 Kotlin 中(如 Java)表示 32 位有符号整数,因此它们的最大值为 2,147,483,647。
您要做的是将 200,000,000 乘以 11,得到 2,200,000,000 - 大于最大值。所以只有该数字的最低有效位可以存储在整数的 32 位中,而你最终会在负数中的某个地方。
如果你想达到这种值,你应该使用 UInt
(无符号整数,可以高两倍),Long
(64 位,因此可以达到高得多)或其他更复杂的类型,如 BigInteger
.
这里有一个 Long
的例子:
val x = "200000000"
val y = "11"
val z = x.toLong() * y.toLong()
println(z) // 2200000000