我无法弄清楚这种现象的原因。我想将字节值OxAB
左移8位。然后,我想将其转换为long。
byte oneByte = (byte) 0xAB;
long converted = (oneByte & 0xFF) << 8;
System.out.println(converted);
在这种情况下,输出为
43776
。但是,如果我将代码更改为此:byte oneByte = (byte) 0xAB;
long converted = (oneByte) << 8;
System.out.println(converted);
输出更改为-21760。我有以下问题:
0xFF
的数据类型是什么?为什么按位AND与
0xFF
阻止符号扩展? 最佳答案
long converted = onebyte; // gives you -85
如果您将其向左移动8次,则可以得到-21760
因为在转换为long的过程中,最左边的位用作符号位。
long converted = onebyte & 0xFF; //gives you 171
如果将它向左移动8次,则可以得到43776
因为当使用按位和字节时,short和char首先被转换为int然后执行按位运算。
11111111111111111111111110101011 //byte 0xAB casted to int
00000000000000000000000011111111 //0xFF is an int literal
00000000000000000000000010101011 //bitwise and operation
在按位之后并使用0xFF将符号位删除
关于java - Java左移澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60635098/