我刚从K&R C书第二章学到,假设我有这个代码:

#include <stdio.h>
int
main(void)
{
    printf("0x%016llx\n", ~0); //0x00000000ffffffff

    printf("0x%016llx\n", ~0 >> 1); //0x00000000ffffffff
    printf("0x%016llx\n", 0x00000000ffffffff >> 1); //0x000000007fffffff
    return 0;
}

我希望~0 >> 1会像0x000000007fffffff那样给出0x00000000ffffffff >> 1的值,而~0具有0x00000000ffffffff的值。
为什么~0 >> 1不移位?

最佳答案

llx格式说明符需要一个unsigned long long参数,但您传入的是一个int
这一转变并没有给你带来你所期望的结果,因为~0会导致int的负值。所以右移保留符号位,即a1位移到左边。
在整数常量上加上ULL后缀以强制它们成为正确的类型:

printf("0x%016llx\n", ~0ULL);
printf("0x%016llx\n", ~0ULL >> 1);
printf("0x%016llx\n", 0x00000000ffffffffULL >> 1);

然后您将得到预期的输出:
0xffffffffffffffff
0x7fffffffffffffff
0x000000007fffffff

因为值现在是无符号的,0位总是左移。

07-26 08:27