我很困惑如何在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保持相同)。请解释一下。
答案 0 :(得分:4)
如果完成符号扩展,那么值255应打印为负值
这是您错误的地方 - unsigned char
类型的所有值(包括255)都可以用int
表示,因此从int
升级到unsigned char
只是没有任何有趣的事情就会发生。
出现问题的地方是签名值必须转换(与促销不同,并且为操作数创建公共类型)是无符号值。如果该签名类型具有负值,则转换为无符号类型将更改该值。
总之,整数提升保留了值(包括符号),转换可以改变值。
答案 1 :(得分:4)
va_arg函数没有关于...
部分的预期类型的信息。因此,无原型声明的函数的升级规则适用。这意味着所有短于int
的类型都会直接提升为int
或unsigned
。因此,printf
函数永远不会看到(un)signed char
。
答案 2 :(得分:2)
签名扩展已完成。但是你无法签名扩展unsigned char
因为它没有符号位。符号扩展的整个点是保持值相同。或者,如果您更喜欢这样考虑,每个无符号变量都有一个隐含的零符号位。因此,当它被符号扩展为更大的有符号类型时,符号位在较大的类型中应为零。
答案 3 :(得分:1)
两者都被提升为整体 - 因此保持标志。
答案 4 :(得分:0)
签名扩展已完成。
但自uc
以来,没有任何迹象,因为它是unsigned char
,所以它是正面的。