在 Java 中长期被视为 32 位?
Long getting treated as 32 bits in Java?
我正在尝试运行下面的代码,
public class MyClass {
public static void main(String args[]) {
long x = 1 << 39;
long l = 537150415L;
l = l | x;
System.out.println(x);
System.out.println(l);
}
}
这输出,
128
537150415
我原以为 x
会是一个很大的数字。 128
看起来像 2^7
,也就是 2^(39-32)
。但是我以为long是64位的。
我正在尝试在集合中创建一组数字。数字可以在 1-60 之间。
JDoodle link - [https://www.jdoodle.com/online-java-compiler#&togetherjs=uH49U5c4Ej]
您需要使用 1L
而不是 1
来将 1 表示为文字 long
:
long x = 1L << 39;
long l = 537150415L;
l = l | x;
System.out.println(x);
System.out.println(l);
问题是 1 << 39
是一个 32 位表达式。所以
long x = 1 << 39;
首先计算 32 位值,然后将其符号扩展为 64 位值以进行赋值。
如果要创建 64 位掩码,请使用 1L << 39
。
java 的问题是,int
在 c++ 中是 int32_t
而 long
是 int64_t
,没有无符号类型.
这意味着你必须考虑二进制的补码,所以当设置高位时,你有 -2^64。
如果你只关心一个位集,你不应该直接打印长的。做这样的事情:
for (int i = 0; i < 64; i++) {
System.out.println((l & (1 << i)) != 0 ? "Bit " + i + " is set" : "Bit " + i + " is not set");
}
编辑:好的,虽然这不是这里的问题,但为了完整起见我会留下答案(因为这些确实是需要考虑的陷阱)
我正在尝试运行下面的代码,
public class MyClass {
public static void main(String args[]) {
long x = 1 << 39;
long l = 537150415L;
l = l | x;
System.out.println(x);
System.out.println(l);
}
}
这输出,
128
537150415
我原以为 x
会是一个很大的数字。 128
看起来像 2^7
,也就是 2^(39-32)
。但是我以为long是64位的。
我正在尝试在集合中创建一组数字。数字可以在 1-60 之间。
JDoodle link - [https://www.jdoodle.com/online-java-compiler#&togetherjs=uH49U5c4Ej]
您需要使用 1L
而不是 1
来将 1 表示为文字 long
:
long x = 1L << 39;
long l = 537150415L;
l = l | x;
System.out.println(x);
System.out.println(l);
问题是 1 << 39
是一个 32 位表达式。所以
long x = 1 << 39;
首先计算 32 位值,然后将其符号扩展为 64 位值以进行赋值。
如果要创建 64 位掩码,请使用 1L << 39
。
java 的问题是,int
在 c++ 中是 int32_t
而 long
是 int64_t
,没有无符号类型.
这意味着你必须考虑二进制的补码,所以当设置高位时,你有 -2^64。
如果你只关心一个位集,你不应该直接打印长的。做这样的事情:
for (int i = 0; i < 64; i++) {
System.out.println((l & (1 << i)) != 0 ? "Bit " + i + " is set" : "Bit " + i + " is not set");
}
编辑:好的,虽然这不是这里的问题,但为了完整起见我会留下答案(因为这些确实是需要考虑的陷阱)