在Java中,为什么(字节)400000和(字节)-400000都有结果-128?
实际上,我遵循https://stackoverflow.com/a/9085666/1037217
的计算方法案例:400000 二进制:1100001101010000000 修剪到8位数:10000000 由于最左边的数字是1,所以-1从它开始:01111111 然后将其反转:10000000 结果:-128
案例:-400000 二进制:-1100001101010000000 修剪到8位数:10000000 由于最左边的数字是1,所以-1从它开始:01111111 然后将其反转:10000000 结果:128
同样的方法也适用 (短)40000 = -25536 (短)-40000 = 25536
答案 0 :(得分:5)
将int
转换为byte
将保留int号的最后8位(最后一个字节)。
400000 = 0x61a80
-400000 = 0xfff9e580
你的两个号码都有相同的最后8位:0x80
,这是2的补码中的-1
。
例如:
System.out.println((byte)0x23403); // Prints 3 (the last 8 bits: 0x03 = 3)
System.out.println((byte)0x23483); // Prints -125 (last 8 bits: 0x83 = -125)
// (in 2's complement: 0x83 = -(128-3) = -125)
答案 1 :(得分:2)
因为byte
的范围是-128到127.您的两个值都会溢出,然后会受到缩小转化的影响。引用JLS Example 5.1.3-2. Narrowing Primitive Conversions that lose information,
// An int value too big for byte changes sign and magnitude:
答案 2 :(得分:0)
正如你所说:
对于案例:400000二进制:1100001101010000000修剪到8位:10000000由于最左边的数字是1,所以-1从它:01111111然后反转它:10000000结果:-128
对于案例:-400000二进制:-1100001101010000000修剪到8位:10000000由于最左边的数字是1,所以-1从它:01111111然后反转它:10000000结果:128
在这两种情况下,您获得的位模式为10000000
。这相当于-128
两次。 byte
无法代表值128
;它超出了范围。
但是,您的程序并不完全正确。你不能在那里放一个负号然后"修剪到8位"。负号不是有效状态。您应该研究2s complement representation of integers。