为什么 (-7 << 16) | 75 有一些额外的位?

Why (-7 << 16) | 75 has some extra bits?

我遇到一个问题,在数字中设置了一些额外的位:

void print2_helper(int x) {
  int isodd = x%2 != 0;
  x /= 2;
  if (x)
    print2_helper(x);
  putchar('0' + isodd);
}
printf("-7 << 16: ");
print2_helper((-7 << 16));

printf("\n(-7 << 16) | 75: ");
print2_helper((-7 << 16) | 75);
puts("\n");

输出:

-7 << 16: 1110000000000000000
(-7 << 16) | 75: 1101111111110110101

为什么简单的 |75 会产生如此奇怪的数字?

(-7 << 16) | 75 产生一个负值,而 print2_helper 不能像其他人指出的那样在负值上正常工作。

x /= 2 不等同于负整数右移。 让我们看看当 x=-3(为简洁起见,我们使用 5 位整数)

时结果如何

11101 = -3

-3 / 2 = -1

-1 在二进制表示中是 11111,这不是预期的结果 (01110)。

print2_helper 上使用无符号整数参数应该可以解决问题。 (连同修复问题 PSKocik 已经在评论中提到,可以通过添加 u 后缀使其成为无符号整数来完成:(-7u << 16) | 75