Java 为什么移位一个移位字节会根据移位顺序产生不同的值?

Java 为什么移位一个移位字节会根据移位顺序产生不同的值?,java,casting,bit-manipulation,byte,bit-shift,Java,Casting,Bit Manipulation,Byte,Bit Shift,考虑以下Java代码: byte a = (byte) 0b01111110; //Binary Literal byte b1 = (byte) (a << 1); byte c1 = (byte) (a >> 1); byte b2 = (byte) (b1 >> 1); byte c2 = (byte) (c1 << 1); System.out.println("A:" + a + " B1:

考虑以下Java代码:

    byte a = (byte) 0b01111110; //Binary Literal
    byte b1 = (byte) (a << 1);
    byte c1 = (byte) (a >> 1);
    byte b2 = (byte) (b1 >> 1);
    byte c2 = (byte) (c1 << 1);
    System.out.println("A:" + a + " B1:" + b1 + " C1:" + c1 + " B2:" + b2 + " C2:" + c2);

为什么字节“b2”的值不等于“a”(本例中为“c2”)的值,即使这两个移位都不会导致二进制数字被删除?

因为符号扩展。使用
>
可防止:

byte a = (byte) 0b01111110; // 0b01111110 = 126
byte b1 = (byte) (a << 1);  // 0b11111100 =  -4  <-- overflow
byte c1 = (byte) (a >> 1);  // 0b00111111 =  63
byte b2 = (byte) (b1 >> 1); // 0b11111110 =  -2  <-- sign extension
byte c2 = (byte) (c1 << 1); // 0b01111110 = 126

byte x = (byte) (b1 >>> 1); // 0b01111110 = 126  <-- no sign extension
字节a=(字节)0b01111110;//0b01111110=126
字节b1=(字节)(A1);//0B0011111=63
字节b2=(字节)(b1>>1);//0B111110=-2>1);//0b01111110=126
…这两个移位都不会导致二进制数字丢失

错。 所有移位操作都会导致数字丢失。幸运的是,你所观察到的似乎只是反驳这一点,因为
0
位正在被丢弃。我认为你的问题必须与理解算术移位有关(
>
)。当执行算术移位时,符号位被扩展以保留a数字的符号性

引用Java的话:

有符号左移位运算符“”将位模式移位到 正确的。位模式由左侧操作数和 要由右侧操作数移位的位置数。未签名的 右移运算符“>>>”将零移到最左边的位置, 而“>>”之后最左边的位置取决于符号扩展


因为你已经满溢了。我不认为这是“愚蠢的运气”,那只是你的假设,而且非常主观Java没有一个
:“好的事情完全是偶然发生的,没有计划或应得的”。你认为这是偶然的,不是故意的。从你的链接,同义词:侥幸,偶然。如果你仔细重读他的问题,你会发现是愚蠢的运气导致这些变量匹配:二进制零被移开了。无论如何,我不会在这个网站上争论英语的语义学,所以请随意发表另一条评论——我将忽略它。
byte a = (byte) 0b01111110; // 0b01111110 = 126
byte b1 = (byte) (a << 1);  // 0b11111100 =  -4  <-- overflow
byte c1 = (byte) (a >> 1);  // 0b00111111 =  63
byte b2 = (byte) (b1 >> 1); // 0b11111110 =  -2  <-- sign extension
byte c2 = (byte) (c1 << 1); // 0b01111110 = 126

byte x = (byte) (b1 >>> 1); // 0b01111110 = 126  <-- no sign extension