我正在阅读 Horstmann 的 Core Java。
这是一个例子:
byte nx = (byte)300;
System.out.println(nx);
结果是 44。我不明白为什么?我想有两种变体:1)一切都被毁了,你只会得到一个完整的垃圾;2)有一些逻辑。
我倾向于第二种变体,因为这本书告诉我收到的是 44。所以,它背后有一些算法。
能不能帮我理解一下。
我正在阅读 Horstmann 的 Core Java。
这是一个例子:
byte nx = (byte)300;
System.out.println(nx);
结果是 44。我不明白为什么?我想有两种变体:1)一切都被毁了,你只会得到一个完整的垃圾;2)有一些逻辑。
我倾向于第二种变体,因为这本书告诉我收到的是 44。所以,它背后有一些算法。
能不能帮我理解一下。
强制转换byte
将仅保留最低有效 8 位。300 (as an int
here) 二进制是
00000000 00000000 00000001 00101100
保留最后 8 位会丢弃代表 256 的最重要的 1(以及它之前的所有其他内容),因此剩余值为 300 - 256 = 44
00101100
看300的二进制展开:
100101100
现在砍掉除最后 8 位以外的所有位(byte
Java 中 a 的宽度):
00101100
现在将其转换回整数值:
44
请注意,您必须小心符号位。您不能只取除以 256 后的余数。例如:
byte nx = (byte)400;
System.out.println(nx);
将打印 -112(不是 144)。那是因为演员表之后的位模式是
10010000
并且最左边(第八)位被视为 -112 的二进制补码表示中的符号位。
字节数据类型只有8位长,十进制数300需要9位。当你投射它时,你将它截断并切断最左边的位,留下十进制数 44 的二进制表示。
如果您需要类比,请考虑将浮点数(如 35.6)转换为 int。因为整数不能有小数位,所以强制转换会从浮点数中截断“.6”,在返回值中完全忽略它。