繁体   English   中英

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

[英]How does the compiler treats printing unsigned int as signed int?

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

{
  unsigned int a = 10;
  a = ~a;
  printf("%d\n", a);
}

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。

当你写a = ~a; 你将a中的每一位都反转,这也称为1的补码。

负数的表示被声明为依赖实现 ,这意味着不同的体系结构可以具有-10-11不同表示。

假设在公共处理器上的32架构使用补码2来表示负数-1将表示为FFFFFFFF(十六进制)或32位到1。

~a表示为= FFFFFFF5或二进制1...10101表示-11。

NOTA:第一部分始终是相同的,不依赖于实现的, ~a FFFFFFF5上的任何32位体系结构。 它只是依赖于实现的第二部分(-11 == FFFFFFF5 )。 顺便说一句,在一个架构上它将是-10,它将使用补码1来表示负数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM