林果皞*_*林果皞 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不换位?
该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总是会向左移位.