转换为字节:我们如何剪辑数字

时间:2013-08-05 19:22:18

标签: java

我正在阅读霍斯特曼的核心Java。

这是一个例子:

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

结果是44.我无法理解为什么?我想2个变种:1)一切都毁了你只是得到一个完整的垃圾; 2)有一些逻辑。

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

你能帮我理解吗。

3 个答案:

答案 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”,在返回的值中完全忽略它。