为什么 Kotlin 不支持无符号整数?
Why doesn't Kotlin support unsigned integers?
我最近遇到了一种情况,在这种情况下,无符号整数会非常有用(例如,任何负值都没有意义等)。令人惊讶的是,我发现 Kotlin 不支持无符号整数 - 而且似乎没有其他原因(即使我看过)。
我是不是漏掉了什么?
为什么 Kotlin 没有原生的无符号类型
这是因为如 this 问题所示,Java 没有内置的无符号类型。
当在 JVM 上使用时,Kotlin 编译为 Java 字节码,因此 Java 的这一限制也适用于 Kotlin。
解决方法
您可以使用 Integer 和 Long 的实用方法对无符号值进行操作 link,但这仍然在内部存储有符号值。
您也可以编写一个实用程序 class 来保存一个值并像 unsigned int 类型一样工作,但这可能比使用上述方法慢。
从 Kotlin 1.3 开始,无符号类型可用并基于内联 类 功能。
请参阅 1.3-M1 版本的 "Unsigned integer types" 部分:https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/
自 Kotlin 1.3 以来,Byte
、Short
、Int
和 Long
的未签名副本确实存在于 Beta 版中,并且是 stable as of Kotlin 1.5:
来自docs:
kotlin.UByte
: an unsigned 8-bit integer, ranges from 0 to 255
kotlin.UShort
: an unsigned 16-bit integer, ranges from 0 to 65535
kotlin.UInt
: an unsigned 32-bit integer, ranges from 0 to 2^32 - 1
kotlin.ULong
: an unsigned 64-bit integer, ranges from 0 to 2^64 - 1
用法
// You can define unsigned types using literal suffixes
val uint = 42u
// You can convert signed types to unsigned and vice versa via stdlib extensions:
val int = uint.toInt()
val uint = int.toUInt()
我最近遇到了一种情况,在这种情况下,无符号整数会非常有用(例如,任何负值都没有意义等)。令人惊讶的是,我发现 Kotlin 不支持无符号整数 - 而且似乎没有其他原因(即使我看过)。
我是不是漏掉了什么?
为什么 Kotlin 没有原生的无符号类型
这是因为如 this 问题所示,Java 没有内置的无符号类型。
当在 JVM 上使用时,Kotlin 编译为 Java 字节码,因此 Java 的这一限制也适用于 Kotlin。
解决方法
您可以使用 Integer 和 Long 的实用方法对无符号值进行操作 link,但这仍然在内部存储有符号值。
您也可以编写一个实用程序 class 来保存一个值并像 unsigned int 类型一样工作,但这可能比使用上述方法慢。
从 Kotlin 1.3 开始,无符号类型可用并基于内联 类 功能。
请参阅 1.3-M1 版本的 "Unsigned integer types" 部分:https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/
自 Kotlin 1.3 以来,Byte
、Short
、Int
和 Long
的未签名副本确实存在于 Beta 版中,并且是 stable as of Kotlin 1.5:
来自docs:
kotlin.UByte
: an unsigned 8-bit integer, ranges from 0 to 255
kotlin.UShort
: an unsigned 16-bit integer, ranges from 0 to 65535
kotlin.UInt
: an unsigned 32-bit integer, ranges from 0 to 2^32 - 1
kotlin.ULong
: an unsigned 64-bit integer, ranges from 0 to 2^64 - 1
用法
// You can define unsigned types using literal suffixes
val uint = 42u
// You can convert signed types to unsigned and vice versa via stdlib extensions:
val int = uint.toInt()
val uint = int.toUInt()