编译器如何知道是否扩展零或一?

时间:2015-02-06 07:00:56

标签: c++ c

   int main()
   {

       char c = -1;
       unsigned char u = -1;

       printf("c = %u\n",c);
       printf("c = %d\n",c);

       printf("u = %u\n",u);
       printf("u = %d\n",u);
    }

结果是:

c = 4294967295

c = -1

u = 255

u = 255

当我尝试将其转换为unsigned int时

由于符号扩展,我得到了c = 4294967295

但是当我尝试将unsigned char转换为unsigned int

我得到你= 255

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

在第二种情况下,0被延长。

但我的问题是编译器如何在将小数据放入大内存时检测是否扩展零或一。

2 个答案:

答案 0 :(得分:3)

无符号数字(例如u)不会被符号扩展,它们将被零扩展。这是因为他们没有任何迹象!有符号数(即有符号整数类型的变量)总是符号扩展。您最初将-1分配到无符号类型时可能会产生混淆 - 一旦分配,就不再有符号扩展的可能性。

答案 1 :(得分:2)

印刷涉及两个步骤。

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

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

因此,在步骤a)c = 0b1111.1111.1111.1111.1111.1111.1111.1111之后,由于John Zwinck所描述的规则,u = 0b0000.0000.0000.0000.0000.0000.1111.1111。