printf类型促销和签名扩展

vja*_*n27 5 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);
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

unsigned char value = 255
signed char value = -128
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*urr 4

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

这就是你错的地方 - 包括 255 在内的所有类型值都unsigned char可以用 a 表示int,因此升级到intfromunsigned char就发生了,没有任何有趣的事情。

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

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