我刚刚遇到一种情况,其中无符号整数本来就非常有用(例如,任何负值都没有意义等等)。令人惊讶的是,我发现Kotlin不支持无符号整数 - 并且似乎没有任何其他内容可以解释为什么(即使我看过)。
我错过了什么吗?
答案 0 :(得分:6)
这是因为正如this问题所示,Java没有内置的无符号类型。
当在JVM上使用时,Kotlin编译为Java字节码,因此Java的这种限制也适用于Kotlin。
您可以使用Integer和Long的实用程序方法将值作为无符号link进行操作,但这仍然会将值存储为内部签名。
您还可以编写一个包含值的实用程序类,其行为类似于unsigned int类型,但这可能比使用上述方法慢。
答案 1 :(得分:4)
正如glidor正确提到的那样,自Kotlin 1.3 以来,确实存在Byte
,Short
,Int
和Long
的未签名副本,但要小心,因为它们仍然 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/