0

我正在阅读 Horstmann 的 Core Java。

这是一个例子:

    byte nx = (byte)300;
    System.out.println(nx);

结果是 44。我不明白为什么?我想有两种变体:1)一切都被毁了,你只会得到一个完整的垃圾;2)有一些逻辑。

我倾向于第二种变体,因为这本书告诉我收到的是 44。所以,它背后有一些算法。

能不能帮我理解一下。

4

3 回答 3

3

强制转换byte将仅保留最低有效 8 位。300 (as an inthere) 二进制是

00000000 00000000 00000001 00101100

保留最后 8 位会丢弃代表 256 的最重要的 1(以及它之前的所有其他内容),因此剩余值为 300 - 256 = 44

00101100
于 2013-08-05T19:24:08.663 回答
0

看300的二进制展开:

100101100

现在砍掉除最后 8 位以外的所有位(byteJava 中 a 的宽度):

00101100

现在将其转换回整数值:

44

请注意,您必须小心符号位。您不能只取除以 256 后的余数。例如:

byte nx = (byte)400;
System.out.println(nx);

将打印 -112(不是 144)。那是因为演员表之后的位模式是

10010000

并且最左边(第八)位被视为 -112 的二进制补码表示中的符号位。

于 2013-08-05T19:24:51.387 回答
0

字节数据类型只有8位长,十进制数300需要9位。当你投射它时,你将它截断并切断最左边的位,留下十进制数 44 的二进制表示。

如果您需要类比,请考虑将浮点数(如 35.6)转换为 int。因为整数不能有小数位,所以强制转换会从浮点数中截断“.6”,在返回值中完全忽略它。

于 2013-08-05T19:29:01.740 回答