代码:
System.out.println((byte)0b10000000 >> 6);
System.out.println(0b10000000 >> 6);
输出:
-2
2
我知道传入一个未发送的字节会把它变成一个整数(第二行)
它仍然给出2
,即0b10的预期答案。
但是,将其作为字节(第一行)进行转换会返回-2
。
我很困惑。
答案 0 :(得分:0)
字节是8位有符号整数,因此当您将第一个二进制数转换为byte
时,第一位被解释为符号,因此它被解释为-127
。
您可以使用System.out.println((byte)(0b10000000 >> 6));
解决此问题(在转变之后 )。
我知道传入一个未发布的字节...
呃,0b...
并不代表“字节”;它意味着“二元”。你根本没有传入一个未被发现的字节。 (你的二进制文字在一个字节中拟合,但它被解释为一个int。)
答案 1 :(得分:0)
The shift operator >>
keeps the sign bit.
n的值>> s是带有符号扩展的右移位s位。
所以字节值
1000 0000
提升为int
,as required by the Java Language Specification
对每个操作数分别执行一元数字提升(第5.6.1节)。
给出
1111 1111 1111 1111 1111 1111 1000 0000
因为widening conversion from byte
to int
将有符号整数值扩展为整数类型T. 只需对整数的二进制补码表示进行符号扩展 价值填补更广泛的格式。
并且移动了6变为
1111 1111 1111 1111 1111 1111 1111 1110
是整数值-2。
在
的情况下System.out.println(0b10000000 >> 6);
文字实际上是int
,即
0000 0000 0000 0000 0000 0000 1000 0000
所以向右移动6变为
0000 0000 0000 0000 0000 0000 000 0010
值为2.
答案 2 :(得分:0)
以下是每个班次的步骤,以明确发生了什么
字节(用MSB = 1签名)
10000000(-128)
11000000(-64)
11100000(-32)
11110000(-16)
11111000(-8)
11111100(-4)
11111110(-2)
整数(用MSB = 0签名)
0000000010000000(128)
0000000001000000(64)
0000000000100000(32)
0000000000010000(16)
0000000000001000(8)
0000000000000100(4)
0000000000000010(2)