咨询Kotlin文档中无符号与有符号类型互改属二进制不兼容变更的含义
问题解答
首先先明确Kotlin官方文档提到的变更说明的含义:
将无符号类型更改为对应的有符号类型(反之亦然)属于二进制不兼容变更。
二进制不兼容的直观示例
这种不兼容通常出现在对外发布的库类代码场景下:
- 假设你开发了一个工具库v1版本,对外暴露方法
fun getUserId(): UInt,其他业务项目依赖v1版本编译打包后,字节码里记录的调用方法签名会明确标注返回值为无符号整型UInt - 后续你发布工具库v2版本,把该方法返回值改成了
Int,如果业务项目不重新编译,直接替换依赖的工具库为v2版本,运行时会直接抛出NoSuchMethodError异常,因为旧的业务字节码找不到对应签名的方法,这就是二进制不兼容的实际表现。
你给出的两段代码的运行情况
这两段代码都是内部显式做类型转换,不涉及对外暴露的API签名修改,在所有支持Kotlin运行的环境中结果都是固定一致的,不会出现跨机器的兼容问题:
第一段代码
val a: UInt = 10000 val b: Int = a.toInt()
10000属于Int和UInt的重叠正数范围,转换后b的值固定为10000。
如果a的取值超过Int的最大值(2^31-1 = 2147483647),转换会直接按二进制位映射为有符号负数,结果也是固定的,和运行机器无关。
第二段代码
val a: Int = 10000 val b: UInt = a.toUInt()
10000是正整数,转换后b的值固定为10000U。
如果a是负数,转换会按二进制位映射为对应的大数值无符号整型,结果同样固定,不会因运行环境不同发生变化。
内容的提问来源于stack exchange,提问作者Sepideh Abadpour
相关产品推荐
相关产品推荐

