为何Kotlin不支持无符号整数?场景需求下的疑问咨询
Kotlin中的无符号整数支持
嘿,其实你没遗漏什么关键信息——Kotlin是支持无符号整数的,只是它的存在感可能没那么强,容易被忽略!
从Kotlin 1.3版本开始,官方就引入了完整的无符号整数类型,专门针对你提到的「负值毫无意义」的场景,比如计数、位运算、处理二进制数据等。
可用的无符号整数类型
Kotlin提供了四种无符号整数类型:
UByte:8位无符号整数,范围0到255UShort:16位无符号整数,范围0到65535UInt:32位无符号整数,范围0到4294967295ULong:64位无符号整数,范围0到18446744073709551615
如何使用无符号整数
- 字面量声明:在数字后面加上后缀
u或U,就能直接创建无符号整数:val positiveCount: UInt = 100u val maxUByte: UByte = 255u - 类型转换:可以从有符号整数或字符串转换为无符号类型,但要注意负数转换的溢出行为(负数会被当作对应的无符号最大值范围内的正数):
val signedInt = -1 val unsignedInt = signedInt.toUInt() // 结果是 4294967295(UInt的最大值) - 运算操作:无符号整数支持和有符号整数类似的运算(加减乘除、位运算等),但溢出逻辑遵循无符号规则:
val a = 255u.toUByte() val b = 1u.toUByte() val c = a + b // 结果是 0(UByte溢出后循环)
为什么你可能一开始没注意到?
- Kotlin默认更偏向和Java的互操作性,而Java本身没有原生无符号整数类型(仅对
byte有部分无符号处理),所以无符号类型不是默认选项,需要显式声明。 - 早期版本的Kotlin确实没有无符号整数支持,如果你查的是1.3之前的资料,自然会以为它不支持。
额外注意点
- 在JVM平台上,无符号整数类型本质是用对应的有符号类型包装的,但Kotlin编译器会在编译层面保证无符号的语义,不用担心底层实现影响逻辑。
- 在Kotlin/Native或Kotlin/JS平台上,无符号类型会直接映射到目标平台的原生无符号类型,性能更贴近底层。
内容的提问来源于stack exchange,提问作者starbeamrainbowlabs
相关产品推荐
相关产品推荐

