我引用 Herbert Schildt 的话:JAVA,完整参考第 8 版。
第4章:操作员
当您转移时,Java 自动类型提升会产生意想不到的结果byte
and short
价值观。如你所知,byte
and short
价值观被提升为int
当计算表达式时。此外,这样的表达式的结果也是int
。这意味着结果left shift
on a byte
or short
值将是int
,以及bits
转移left
直到它们移过去才不会丢失bit
位置31
.
此外,负byte
or short
值将是符号扩展当它晋升为int
。就这样高位将充满1’s
。由于这些原因,要对字节或短整型执行左移意味着必须丢弃 int 结果的高位字节。例如,如果您左移一个byte
值,该值必须首先提升为int
然后转移。这意味着您必须丢弃第一个3 bytes
如果您想要的是移位字节值的结果。最简单的方法是将结果简单地转换回byte
.
byte a = 64, b;
int i;
i = a << 2;
b = (byte)(a<<2);
"Binary Equivalent of b : "+Integer.toBinaryString(b); // gives 0
byte i1 = -5,i2;
int s;
s = i1<<2;
i2 = (byte)(i1<<2);
Integer.toBinaryString(i2); //gives 11111111111111111111111111101100 WHY?
我已声明i2
属于byte
。因此它应该包含8 bits
(一个字节)。为什么32
bits
。是否顶部3 bytes
的结果需要被丢弃。这恰好仅在负数的情况下发生(此处-5
)。不会发生64
。请建议。
的价值i2
是(二进制)1110 1100
或(十进制)-20
.
参数类型Integer.toBinaryString(int)
is int
, so i2
晋升为int
。这涉及到符号扩展,意味着“符号位”(前导1
对于负数或前导0
对于正数或零)被复制到所有较高位,产生(二进制)1111 1111 1111 1111 1111 1111 1110 1100
或(十进制)-20
.
当您查看二进制表示形式时,这可能看起来很奇怪,但是当您查看十进制表示形式时,它就有意义了。符号扩展的目的是保留实际的数值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)