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