按位异或 Java long

8
我正在使用Ubuntu 12.04上的Oracle Java 7.51,并尝试做这件事。
long a = 0x0000000080000001 ^ 0x4065DE839A6F89EEL;
System.out.println("result "+ Long.toHexString(a));

Output: result bf9a217c1a6f89ef

但是我期望的结果应该是4065de831a6f89ef,因为在Java中^操作符是按位异或。我哪部分Java规范理解错误了?
1个回答

19
你需要在第一个整数字面量的末尾添加一个 L
long a = 0x0000000080000001L ^ 0x4065DE839A6F89EEL;

否则,它是一个int字面量,而不是long(前导零被忽略)。^ 操作符将第一个操作数值从0x80000001提升为long,但由于符号位设置,提升的结果是0xFFFFFFFF80000001L。

谢谢你的解释。由于Eclipse没有把第一个文字值中没有加上尾随的L标记出来,所以我一直以为是正确的。 - Soham
1
@Soham - 是的,你必须小心那些前导零;它们对我们人类来说比Java编译器更重要 :) - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接