为什么(字节)400000和(字节)-400000结果-128

时间:2014-10-23 04:06:26

标签: java casting byte twos-complement

在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

3 个答案:

答案 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

相关问题