我刚从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
位总是左移。