在 Java 中,不同的数值类型能够表示的数值范围不相同,不同的数值类型经常需要互相转换,有自动转换和强制转换两种方式。
数值类型的表示范围可以理解为盛放液体的容器,容量小的容器可以随意将液体倒入大容量容器。反过来则不行,多余的液体会溢出。
强制类型转换分为两种情形,比如 byte(233)
和 byte(300)
两者的计算略有差别。
233 是 4 字节 32 位的 int 型,二进制表示为 00000000 00000000 0000000 11101001
,byte 型是 1 字节 8 位,属于强制类型转换。强制转换的过程中,Java 直接将前 24 位截断,只保留后面 8 位 11101001
。
11101001
最左一位是 1,表示是负数,而负数是以补码的形式存在的,因此还需要换算成原码。最左一位固定不动,其他 7 位取反,即 10010111
,换算成十进制即为 -23。
300 是 4 字节 32 位的 int 型,二进制表示为 00000000 00000000 00000001 00101100
,转 byte 属于强制类型转换。Java 将前 24 位截断,只保留后面 8 位 00101100
。
最左一位是 0,表示是正数,故不需要反码——>原码的过程,换算成十进制即为 44。
1 | public class test |