Java:4 字节到 32 位整数

标签 java integer byte unsigned signed

我试图理解以下代码:

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

我不明白的是你为什么用 OxFF 与它,你是用 8 位值和 8 位值,就像这样 (11111111),所以这应该给你相同的结果。

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

最佳答案

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

                           //                      sign bit
                           //                         v
byte b = -1;               //                         11111111 = -1
int i = (int) b;           // 11111111111111111111111111111111 = -1
                           // \______________________/
                           //      sign extension

通过执行 & 0xFF 可以防止这种情况发生。即

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

关于Java:4 字节到 32 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28097873/

相关文章:

swift - 如何快速将浮点值转换为字节数组?

java - 将 ArrayList<String> 转换为 byte[]

java - James Gosling 解释为什么 Java 的字节是有符号的

java - 所有唯一排列 - 堆栈溢出问题

java - 优先级队列行为异常

vb.net - VB检查int是否为空

c++ - 为什么标准同时提供了 is_integer 和 is_exact?

java - 如何克隆 jtable

java - 使用 Java 注解消除重复

java - 从java中的文件中提取数值