问题描述
考虑下面的java代码片段
Consider the following snip of java code
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
如何?
how?as b in binary 1111 0001
after unsigned right shift 0000 1111
hence 0x0f
but why is it 0xff
how?
推荐答案
问题是所有参数在转换操作发生之前首先被提升为 int
:
The problem is that all arguments are first promoted to int
before the shift operation takes place:
byte b = (byte) 0xf1;
b
已签名,因此其值为-15。
b
is signed, so its value is -15.
byte c = (byte) (b >> 4);
b
首先符号扩展到整数 -15 = 0xfffffff1
,然后右移到 0xffffffff
并截断为 0xff
由强制转换为字节
。
b
is first sign-extended to the integer -15 = 0xfffffff1
, then shifted right to 0xffffffff
and truncated to 0xff
by the cast to byte
.
byte d = (byte) (b >>> 4);
b
首先符号扩展到整数 -15 = 0xfffffff1
,然后右移到 0x0fffffff
并截断为 0xff
由强制转换为字节
。
b
is first sign-extended to the integer -15 = 0xfffffff1
, then shifted right to 0x0fffffff
and truncated to 0xff
by the cast to byte
.
你可以做(b& ; 0xff)>>> 4
以获得所需的效果。
You can do (b & 0xff) >>> 4
to get the desired effect.
这篇关于无符号右移的行为应用于字节变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!