考虑下面的 java 代码片段
byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);
输出:
c=0xff
d=0xff
预期输出:
c=0x0f
怎么样?
作为二进制中的 b 1111 0001
在无符号右移后 0000 1111
因此 0x0f
但为什么它是 0xff
怎么样?
最佳答案
问题是在移位操作发生之前,所有参数首先被提升为 int
:
byte b = (byte) 0xf1;
b
是有符号的,所以它的值为 -15。
byte c = (byte) (b >> 4);
b
首先符号扩展为整数 -15 = 0xfffffff1
,然后右移至 0xffffffff
并截断为 0xff
被强制转换为 byte
。
byte d = (byte) (b >>> 4);
b
首先符号扩展为整数 -15 = 0xfffffff1
,然后右移至 0x0fffffff
并截断为 0xff
被强制转换为 byte
。
你可以做 (b & 0xff) >>> 4
来得到想要的效果。
关于java - 应用于字节变量的无符号右移行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3948220/