为什么 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 以来,ByteShortIntLong 的未签名副本确实存在于 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()