一、测试环境
名称 | 版本 |
---|
操作系统 | Red Hat Enterprise Linux Server release 7.9 (Maipo) |
CPU | 12th Gen Intel® Core™ i7-12700H |
内存 | 5G |
JDK | 1.8.0_171 |
Scala | 3.1.2 |
二、测试代码
object TestDataTypeConvert {
def main(args: Array[String]): Unit = {
val T_Int: Int = 130
val T_Byte: Byte = T_Int.toByte
println(s"${T_Byte}")
}
}
三、编译执行
[root@node0 src]
[root@node0 test]
[root@node0 test]
-126
四、问题
数据类型 | 描述 |
---|
Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Int 类型数据130转换成Byte类型数据,超出Byte类型数据长度,结果变为-126。
五、情况分析
(0)Int 类型数据130转换成二进制数据,以下为转换过程:
130 / 2 = 65 --- 0
65 / 2 = 32 --- 1
32 / 2 = 16 --- 0
16 / 2 = 8 --- 0
8 / 2 = 4 --- 0
4 / 2 = 2 --- 0
2 / 2 = 1 --- 0
1 / 2 = 0 --- 1
(1)int类型数据130对应二进制数为:0000 0000 0000 0000 0000 0000 1000 0010
(2)byte为8位,只需要取32位的最后8位,进行截断后为:1000 0010
(3)再去取补码,负数取补码为符号位不变取反加一:
1000 0010
|
|取反
|
1111 1101
|
|加一
|
1111 1110
(4)1111 1110的第一位符号位为符号位,1为负,0为正,这里第一位为1为负数,111 1110取对应的十进制数据
(5)计算过程
1111 1110
|
|
|
-1 * (0*2^0 + 1*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 1*2^5 + 1*2^6)
|
|
|
-1 * (0 + 2 + 4 + 8 + 16 + 32 + 64)
|
|
|
-126