关于二进制位移时候的疑惑
int main()
{
int k = 1 ^ (1 << 31 >> 31);
printf("%d\n", k);
return 0;
}
{
int k = 1 ^ (1 << 31 >> 31);
printf("%d\n", k);
return 0;
}
常量1 默认数据类型是 int,1<<31最高为符号位为1,所以被认为是负数,(1<<31)>>31右移的时候自动补1而不是补0就变成-1,所以k是-2。
int main()
{
int x = 1;
int k = x ^ (x << 31 >> 31);
printf("%x\n", x<<31);
printf("%x\n", x<<31>>31);
printf("%x\n", k);
printf("k=%d\n", k);
return 0;
}
80000000
ffffffff
fffffffe
k=-2
int main()
{
unsigned int x = 1;
int k = x ^ (x << 31 >> 31);
printf("%x\n", x<<31);
printf("%x\n", x<<31>>31);
printf("%x\n", k);
printf("k=%d\n", k);
return 0;
}
80000000
1
0
k=0