java - 如何将有符号整数转换为无符号长工作

标签 java

我似乎无法从根本上理解将 signed int 转换为 unsigned long 的工作原理。

下面的代码到底发生了什么? 在什么情况下您想将 int 转换为 unsigned long ? 为什么不将 signed long(而不是 Int)转换为 unsigned long?

public static long getUnsignedInt(int x) {
    return x & 0x00000000ffffffffL;
}

Best way to convert a signed integer to an unsigned long?

什么是 0x00000000ffffffffL?

最佳答案

int 的范围从 -231 到 231-1 ,而数据类型本身需要 32 个字节。最高有效位,第 32 位,用作符号位。

现在,如果您可以将此位用作数字“绝对值”的一部分,则范围将从 0 到 232。这会使 int 无符号,但 Java 数据类型有符号。因此,这是不可能的,除非您移动到可以容纳 32 位而不影响符号位的数据类型。

232 = 1111 1111 1111 1111 1111 1111 1111 1111

现在,将其移动到下一个更大的数据类型 long,它可以容纳 64 位,63 位表示绝对值,最高有效位作为符号位。完全相同的数字看起来像这样。

232 = 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111

0xffffffffL = 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111

现在,查看 int 值(试试这个 Integer.toBinaryString(-2);)。比如说,你有一些 int,比如 -2。在二进制中,它表示为

                                        1111 1111 1111 1111 1111 1111 1111 1110

"and"this with 0xffffffffL [末尾的 L 表示它是一个 long] [十六进制的 f1111 二进制; 8 个 f,所以 8 个 1111s](试试这个 Long.toBinaryString(0xfffffffL);)

0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 

你得到了,

0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1110

恰好是 4294967294 = 232 - 2。正如预期的那样。 :)

关于java - 如何将有符号整数转换为无符号长工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36277300/

相关文章:

java - 如何在 Spark 中将两个 DataFrame 与组合列连接起来?

java - 如何在 Eclipse 中设置编译器选项 'processor'?

java - Android 中的 IllegalArgumentException

java - 有没有办法在远程调试期间搜索堆栈中当前位置可用的变量?

java - 为什么在这种情况下我必须使用final?

java - SpringWS Junit测试异常: No endpoint can be found for request [SaajSoapMessage

java - 在 Java 中连续计算字符

java - java中如何从另一个字符中获取一个字符

Java 通过读取前几个字节读取实际文件类型(取证)

Java 泛型 - 遇到棘手的情况时遇到麻烦