为什么Kotlin不支持无符号整数?

21

最近我遇到了这样一种情况,使用无符号整数将非常有用(例如,任何负值都没有意义等)。令人惊讶的是,我发现 Kotlin 不支持无符号整数 - 而且似乎也没有其他关于为什么不支持的信息(尽管我已经搜索过了)。

我错过了什么吗?


1
@nhaarman 一个Java答案与Kotlin问题有什么关系? - starbeamrainbowlabs
2
@starbeamrainbowlabs 你刚才说的是我想到的那个吗? - Vivick
1
如果你指的是我不完全理解Java和Kotlin之间的关系,那么是的。 - starbeamrainbowlabs
1
Kotlin被转译成Java,这就是为什么没有对无符号整数的“真正”支持。你仍然可以通过使用Unsigned类来解决问题,但可能会遇到几个问题。 - Vivick
10
@Vivick,Kotlin并不是转换成Java源代码,而是被翻译成JVM(Java虚拟机)字节码。请勿误导他人。 - Serid
显示剩余2条评论
3个回答

32

ByteShortIntLong 的无符号类型在 Kotlin 1.3 Beta 中已经存在,稳定于 Kotlin 1.5:

来自 docs

kotlin.UByte: 无符号 8 位整数,范围从 0 到 255
kotlin.UShort: 无符号 16 位整数,范围从 0 到 65535
kotlin.UInt: 无符号 32 位整数,范围从 0 到 2^32 - 1
kotlin.ULong: 无符号 64 位整数,范围从 0 到 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()

8

Kotlin为什么没有本地无符号类型

这是因为正如此问题所示,Java没有内置的无符号类型。

在JVM上使用时,Kotlin编译成Java字节码,因此Java的这种限制也适用于Kotlin。

解决方法

您可以使用Integer和Long的实用程序方法将值作为无符号操作链接,但这仍然将值作为有符号内部存储。

您还可以编写一个实用程序类来保存值并充当无符号int类型,但这可能比上述方法慢。


1
我不明白为什么JVM决定了功能。如果你可以编写代码来模拟无符号,那么字节码也可以做到同样的事情。你是说代码效率低下,所以设计师们觉得不值得支持吗?这并不意味着不能做到。可能只是不值得这么做。 - Mitch

8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接