[英]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.