我似乎无法从根本上理解将 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
] [十六进制的 f
是 1111
二进制; 8 个 f,所以 8 个 1111
s](试试这个 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/