让我从问题开始:
def word(byte1 : Byte, byte2 : Byte, byte3 : Byte, byte4: Byte) : Int = {
((byte4 << 0)) | ((byte3 << 8)) | ((byte2 << 16)) | ((byte1 << 24))
}
这里的目标非常简单。给定4个字节,将它们打包成
Int
。上面的代码不起作用,因为看起来移位运算符试图保留该符号。例如,这:
word(0xFA.toByte, 0xFB.toByte, 0xFC.toByte, 0xFD.toByte).formatted("%02X")
当我期望
FFFFFFFD
时产生FAFBFCFD
。使问题更小:
0xFE.toByte << 8
以二进制补码生成-2,而不是0xFE00。
如何在没有信号问题的情况下进行换班?
最佳答案
与带有0xFF
的字节一起撤消移位前符号扩展的影响:
((byte4 & 0xFF) << 0) | ((byte3 & 0xFF) << 8) | ...