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

时间:2018-05-07 19:56:57

标签: types kotlin language-design unsigned-integer

我刚刚遇到一种情况,其中无符号整数本来就非常有用(例如,任何负值都没有意义等等)。令人惊讶的是,我发现Kotlin不支持无符号整数 - 并且似乎没有任何其他内容可以解释为什么(即使我看过)。

我错过了什么吗?

3 个答案:

答案 0 :(得分:6)

为什么Kotlin没有原生的无符号类型

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

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

的变通方法

您可以使用Integer和Long的实用程序方法将值作为无符号link进行操作,但这仍然会将值存储为内部签名。

您还可以编写一个包含值的实用程序类,其行为类似于unsigned int类型,但这可能比使用上述方法慢。

答案 1 :(得分:4)

正如glidor正确提到的那样,自Kotlin 1.3 以来,确实存在ByteShortIntLong的未签名副本,但要小心,因为它们仍然 experimental

来自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()

答案 2 :(得分:2)

从Kotlin 1.3开始,可以使用无符号类型,并且基于内联类功能。

请参见1.3-M1版本的“无符号整数类型”部分:https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/