Java自动类型促销
我引用赫伯特·席尔德的话:JAVA,第8版的完整参考资料 第4章:运营商 当您移动Java自动类型促销,java,Java,我引用赫伯特·席尔德的话:JAVA,第8版的完整参考资料 第4章:运营商 当您移动byte和short值时,Java的自动类型提升会产生意外的结果。如您所知,在计算表达式时,byte和short值将提升为int。此外,这种表达式的结果也是int。这意味着字节或短值上的左移位的结果将是整数,并且位左移位后的位将不会丢失,直到它们移位超过位位置31 此外,负的字节或短值在提升为int时将被符号扩展。因此,高阶位将填充1的。出于这些原因,对字节或短字节执行左移位意味着您必须放弃int结果的高阶字节。例
byte
和short
值时,Java的自动类型提升会产生意外的结果。如您所知,在计算表达式时,byte
和short
值将提升为int
。此外,这种表达式的结果也是int
。这意味着字节
或短
值上的左移位
的结果将是整数
,并且位
左移位后的位将不会丢失,直到它们移位超过位
位置31
此外,负的字节
或短
值在提升为int
时将被符号扩展。因此,高阶位将填充1的
。出于这些原因,对字节或短字节执行左移位意味着您必须放弃int结果的高阶字节。例如,如果将字节
值左移,则必须先将该值提升为int
,然后再进行移位。这意味着您必须放弃结果的第一个3字节
,如果您想要的是移位字节值的结果。最简单的方法是将结果转换回字节
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?
字节a=64,b;
int i;
i=ai2
的值是(二进制)1110 1100
或(十进制)-20
Integer.toBinaryString(int)
的参数类型是int
,因此i2
被提升为int
。这涉及符号扩展,这意味着“符号位”(负数的前导1
,正数或零的前导0
)被复制到所有高位,产生(二进制)111111111111111111011100
或(十进制)-20
当您看到二进制表示时,这可能看起来很奇怪,但当您看到十进制表示时,这是有意义的。符号扩展的目的是保留实际的数值。第二段是answer@ShirgillAnsari如果答案能解决你的问题/疑问,你应该接受它。