为什么~0 >> 1不会移位?

林果皞*_*林果皞 4 c bit-shift bitwise-operators

我只是从K&R c book第2章学习,假设我有这段代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我希望~0 >> 1会给出0x000000007fffffff怎么样的0x00000000ffffffff >> 1,~0有价值的0x00000000ffffffff.

为什么~0 >> 1不换位?

dbu*_*ush 6

llx格式说明预计的unsigned long long说法,但你传递一个int.

这种转变并没有给你你所期望的~0结果,因为结果int是负值.因此,进行右移保持符号位,即一位1向左移位.

ULL后缀放在整数常量上以强制它们为正确的类型:

printf("0x%016llx\n", ~0ULL);
printf("0x%016llx\n", ~0ULL >> 1);
printf("0x%016llx\n", 0x00000000ffffffffULL >> 1);
Run Code Online (Sandbox Code Playgroud)

然后你会得到预期的输出:

0xffffffffffffffff
0x7fffffffffffffff
0x000000007fffffff
Run Code Online (Sandbox Code Playgroud)

因为这些值现在是无符号的,所以0总是会向左移位.