内存底层二进制位移运算

关于二进制位移时候的疑惑
int main()

{
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

不知道你疑惑是不是出现负数了?
因为int类型的<<31位直接爆了,开longlong得到的是正数


```c++
int main()
{
    // int k = 1 ^ (1 << 31 >> 31);
    long long k = (long long)1 << 31;
    printf("%lld\n", k);
    k >>= 31;
    printf("%lld\n", k);
    k = 1 ^ k;
    printf("%lld\n", k);
    return 0;
}

```