【发布时间】:2020-11-25 06:42:22
【问题描述】:
当我构造掩码以获取 2 的补码格式的最高有效位时,我发现了意外行为。
要检查带符号的 8 位数字中最高有效位是否处于活动状态,我可以按如下方式获取该位。
byte value = -1;
long byteSignMask = 0b1000_0000;
value & byteSignMask;
无论我将0b1000_0000 或1L << 7 用于byteSignMask,结果都是相同的。实际上下面的代码通过了。
long byteSign1 = 1L << 7;
long byteSign2 = 0b1000_0000;
// OK
assertEquals(byteSign1, byteSign2);
但我是为 int 类型做的;同样,结果也是意料之中的。
long intSign1 = 1L << 31;
long intSign2 = 0b1000_0000_0000_0000_0000_0000_0000_0000;
// Fail: expected:<2147483648> but was:<-2147483648>
assertEquals(intSign1, intSign2);
其实它们是不同的。
// intSign1 = 10000000000000000000000000000000
System.out.println("intSign1 = " + Long.toBinaryString(intSign1));
// intSign2 = 1111111111111111111111111111111110000000000000000000000000000000
System.out.println("intSign2 = " + Long.toBinaryString(intSign2));
看起来像整数(intSign1)的字面掩码左填充了1,而移位操作不会造成这样的效果。
为什么二进制字面量表示的整数会自动左补1?是否有任何官方文档描述这种行为?
【问题讨论】:
标签: java binary bit-manipulation