理解c中的按位补码

lin*_*ing 1 c bitwise-operators

我不明白这段代码的输出:

main() {
    int ret = ~(~0 <<5) << 2;
    printf("ret: %d, %u\n", ret, ret);
}


output:
ret: 124, 124
Run Code Online (Sandbox Code Playgroud)

如果我在精神上处理,我这样做:

  • 解析〜0给出二进制1
  • 解析〜0 << 5给出二进制100000
  • 解析〜(〜0 << 5)给出二进制011111
  • 解析〜(〜0 << 5)<< 2给出二进制111100
  • 将二进制111100转换为十进制给出60

我做错了什么 ?

Mil*_*nek 6

int默认情况下,C中的积分文字是s,int通常是4个字节长(取决于编译器).这意味着~0不是1,它是32 1.

~0 == 11111111111111111111111111111111
~0 << 5 == 11111111111111111111111111100000
~(~0 << 5) == 00000000000000000000000000011111
~(~0 << 5) << 2 == 00000000000000000000000001111100
Run Code Online (Sandbox Code Playgroud)