编译器如何知道是扩展零还是一

How the compiler knows whether to extend zeros or ones?

本文关键字:扩展 何知道 编译器      更新时间:2023-10-16
   int main()
   {
       char c = -1;
       unsigned char u = -1;
       printf("c = %un",c);
       printf("c = %dn",c);
       printf("u = %un",u);
       printf("u = %dn",u);
    }

结果是:

c = 4294967295
c = -1
u = 255
u = 255

当我尝试将其转换为无符号 int 时

由于标志扩展,我得到了c = 4294967295

但是当我尝试将无符号字符转换为无符号 int 时

我得到 u = 255

在第一种情况下,1 扩展了 16 位并打印了该数字

在第二种情况下,扩展 0

但我的问题是,当编译器要将小数据放入大内存中时,编译器如何检测是扩展零还是一。

无符号数字(例如您的u(不会进行符号扩展,它们将被扩展为零。 那是因为他们没有征兆! 有符号数字(即有符号整数类型的变量(总是有符号扩展的。 混淆可能来自您最初将-1分配给无符号类型 - 一旦分配,就不再有符号扩展的可能性。

打印涉及两个步骤。

a( 8 位字符(有符号/无符号(转换为 32 位

b( 32 位值打印为有符号或无符号

所以在步骤 a( 之后 c

=0b1111.1111.1111.1111.1111.1111.1111.1111,而 u=0b0000.0000.0000.0000.0000.0000.1111.1111 由于 John Zwinck 描述的规则。