C printf类型提升和符号扩展

C printf类型提升和符号扩展,c,printf,C,Printf,我对printf和一般情况下如何进行类型提升感到困惑。我尝试了以下代码 unsigned char uc = 255 signed char sc = -128 printf("unsigned char value = %d \n", uc); printf("signed char value = %d \n", sc); 这将提供以下输出: unsigned char value = 255 signed char value = -128 这让我想知道促销是如何进行的,以及是否会出

我对printf和一般情况下如何进行类型提升感到困惑。我尝试了以下代码

unsigned char uc = 255
signed char sc = -128

printf("unsigned char value = %d \n", uc);
printf("signed char value = %d \n", sc);
这将提供以下输出:

unsigned char value = 255
signed char value = -128

这让我想知道促销是如何进行的,以及是否会出现标志扩展。如果完成符号扩展,则值255应打印为负值(-128保持不变),如果未完成符号扩展,则-128应打印为正值(255保持不变)。请解释。

符号扩展已完成。但是不能对
无符号字符进行符号扩展,因为它没有符号位。符号扩展的全部目的是保持值不变。或者,如果您愿意这样想,每个无符号变量都有一个隐含的零符号位。因此,当符号扩展到较大的有符号类型时,较大类型中的符号位应为零。

符号扩展完成

但是由于是
uc
,因此没有符号,因为它是
无符号字符
,所以它是正数

如果完成符号扩展,则值255应打印为负值

这就是你错的地方-所有类型为
无符号字符
的值(包括255个)都可以用
int
表示,因此从
无符号字符
升级到
int
没有任何有趣的事

出现问题的地方是有符号值必须转换为无符号值(这与提升不同,是为了创建操作数的公共类型)。如果该有符号类型具有负值,则转换为无符号类型将更改该值


总之,整数提升保留值(包括符号),转换可以更改值。

两者都提升为整数-因此保留符号。

va_arg函数没有关于
..
部分的预期类型的信息。因此,未声明原型的函数的升级规则适用。这意味着小于
int
的所有类型都将直接升级为
int
无符号
。因此,您的
printf
函数永远不会看到
(未)签名的字符