printf类型促销和签名扩展

时间:2012-03-15 08:14:19

标签: 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

这让我想知道促销是如何实际发生的以及是否发生了符号扩展。如果完成符号扩展,则应将值255打印为负值(-128保持不变),如果未执行符号扩展,则应将-128打印为正值(255保持相同)。请解释一下。

5 个答案:

答案 0 :(得分:4)

  

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

这是您错误的地方 - unsigned char类型的所有值(包括255)都可以用int表示,因此从int升级到unsigned char只是没有任何有趣的事情就会发生。

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

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

答案 1 :(得分:4)

va_arg函数没有关于...部分的预期类型的​​信息。因此,无原型声明的函数的升级规则适用。这意味着所有短于int的类型都会直接提升为intunsigned。因此,printf函数永远不会看到(un)signed char

答案 2 :(得分:2)

签名扩展已完成。但是你无法签名扩展unsigned char因为它没有符号位。符号扩展的整个点是保持值相同。或者,如果您更喜欢这样考虑,每个无符号变量都有一个隐含的零符号位。因此,当它被符号扩展为更大的有符号类型时,符号位在较大的类型中应为零。

答案 3 :(得分:1)

两者都被提升为整体 - 因此保持标志。

答案 4 :(得分:0)

签名扩展已完成。

但自uc以来,没有任何迹象,因为它是unsigned char,所以它是正面的。