为什么 (-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
)
我遇到一个问题,在数字中设置了一些额外的位:
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
)