考虑下面的java代码片段
byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);
输出:
c=0xff
d=0xff
预期输出:
c=0x0f
多么?在无符号右移位之后,作为二进制1111 0001
中的b,因此是0x0f
,但是为什么是0xff
?
发布于 2010-10-16 17:18:02
问题是,在进行移位操作之前,所有参数都首先被提升为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
来得到想要的效果。
发布于 2010-10-16 17:13:48
我猜在进行转换之前,b
是对int
进行了符号扩展。
因此,这可能会像预期的那样工作:
(byte)((0x000000FF & b)>>4)
发布于 2010-10-16 17:19:02
Java试图通过定义两个不同的移位操作符来避免显式地支持无符号基本类型。
这个问题谈到了无符号右移位,但示例同时做了(有符号和无符号),并显示了有符号移位的值(>>)。
对于无符号移位(>>>),您的计算将是正确的。
https://stackoverflow.com/questions/3948220
复制相似问题