Java:4 字节到 32 位整数

Pim*_*Pim 1 java unsigned signed byte integer

我试图理解以下代码:

int omgezetteTijd =
((0xFF & rekenOmNaarTijdArray[0]) << 24) | ((0xFF & rekenOmNaarTijdArray[1]) << 16) |((0xFF & rekenOmNaarTijdArray[2]) << 8) | (0xFF & rekenOmNaarTijdArray[3]);
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么你用 OxFF 与它进行 AND 运算,你将一个 8 位值与 8 位像这样 (11111111),所以这应该给你相同的结果。

但是,当我不将它与 OxFF 进行 AND 运算时,我会得到负值吗?无法弄清楚为什么会这样?

aio*_*obe 5

当您一个带有 int 的字节时,该字节将被提升为一个 int。默认情况下,这是通过符号扩展完成的。换句话说:

                           //                      sign bit
                           //                         v
byte b = -1;               //                         11111111 = -1
int i = (int) b;           // 11111111111111111111111111111111 = -1
                           // \______________________/
                           //      sign extension
Run Code Online (Sandbox Code Playgroud)

通过这样做,& 0xFF您可以防止这种情况。IE

                           //                      sign bit
                           //                         v
byte b = -1;               //                         11111111 = -1
int i = (int) (0xFF & b);  // 00000000000000000000000011111111 = 255
                           // \______________________/
                           //     no sign extension
Run Code Online (Sandbox Code Playgroud)