Adi*_*iel 3 c printing unsigned-integer
我想弄清楚为什么以下代码:
{
unsigned int a = 10;
a = ~a;
printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)
a将00001010开始,并且在NOT opertaion之后,将变换
进入11110101.
当一个人试图打印a为有符号整数时,会发生什么
打印结果是-11?
我以为我最终会看到-5可能(根据二进制表示),但不是-11.
我很乐意对此事作出澄清.
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.