意外行为:Java 字节转换询问
在 Java 中,当 int 转换为 byte 时,会出现 -124 的意外结果以下代码片段引发了眉毛:
int i = 132; byte b = (byte)i; System.out.println(b);
深入探究谜团
为了解开这个谜团,我们必须深入研究 Java 中原始数据类型的复杂性。整数(32 位)和字节(8 位)的存储容量不同。大多数原始类型(包括字节)都是有符号的,这意味着它们使用二进制补码编码来表示正值和负值。
符号位优势
在二进制补码中,最有效位 (MSB) 决定符号。将字节转换为 int 时,MSB 将复制到新的 MSB。因此,8 位字节 255 (11111111) 变成了 32 位 int 111111111111111111111111101010101。
负值欺骗
解释负的补码数涉及从左到右查找第一个 MSB 并反转所有后续位。对于上面 255 的 int 表示,这会产生 00000000000000000000000001111111 = -1。这解释了为什么 Java 显示 -124,有符号值 132。
揭示无符号真相
为了揭示字节的无符号值,我们使用位掩码 ( 0xff),隔离最低有效 8 位,删除多余的符号位。将此屏蔽操作应用于字节signedByte = -1 会产生无符号值unsignedByte = 255。
按位魔法
按位AND 屏蔽掉不必要的符号位。当 int 转换为 byte 时,Java 会丢弃前 24 位。掩码确保剩余的 8 位被 Java 解释为正值,因为符号位现在为 0。
揭开字节的阴谋
此行为突出显示数字的有符号和无符号表示之间的关键区别以及数据类型转换期间起作用的位级操作。通过理解这些原理,我们可以破解 Java 中字节转换的难题并避免意外的结果。
以上是为什么在 Java 中将'int”转换为'byte”会导致意外的负结果?的详细内容。更多信息请关注PHP中文网其他相关文章!