编译器如何将unsigned int打印为signed int?

Adi*_*iel 3 c printing unsigned-integer

我想弄清楚为什么以下代码:

{
  unsigned int a = 10;
  a = ~a;
  printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

a00001010开始,并且在NOT opertaion之后,将变换

进入11110101.

当一个人试图打印a为有符号整数时,会发生什么

打印结果是-11

我以为我最终会看到-5可能(根据二进制表示),但不是-11.

我很乐意对此事作出澄清.

Dee*_*epu 6

2的补码表示法用于存储负数.

数字10是4字节二进制的0000 0000 0000 0000 0000 0000 0000 1010.

a = ~a使得a的内容为1111 1111 1111 1111 1111 1111 1111 0101.

处理为signed int时,此数字将告诉编译器将最高位作为符号并将其作为幅度.

msb中的1表示数字为负数.

因此,对剩余的比特执行2的补码操作.

因此,111 1111 1111 1111 1111 1111 1111 0101变为000 0000 0000 0000 0000 0000 0000 1011.

当解释为十进制整数时,这变为-11.