printf 打印大数字用于uint_8



这是代码:

#include <stdio.h>
#include <stdint.h>
int main()
{
uint8_t ui8 = 0xff;
printf(" %xn", ui8);
printf(" %xn", (uint8_t)24);
printf(" %xn", ui8 << (uint8_t)24);
}

输出为:

ff
18
ff000000

问题是:如果我有两个uint8_t变量,为什么结果被"提升"到更高的排名。如果不推广,我为什么会得到这么大的数字。我测试它没有MinGW win7-64位平台

<<的两个参数评估之前都转换为int尽管您试图用(uint8_t)24强制解决问题。

这必然是正确的,因为uint8_t比任何平台上的int窄。

因此,您观察到的结果ff000000与平台上至少 32 位宽的int一致。

发生的事情是所谓的通常算术转换,它会导致<<运算符的两个参数的整数提升

如果不是在printf参数中直接使用 shift 表达式,而是将其存储在uint8_t变量中,则结果将为零。但是,当您调用printf时,您将拥有一个默认的参数提升,它将uint8_t变量转换为int。但这会导致另一个问题,因为即使格式"%x"期望int(实际上是unsigned int,请参阅例如此printf和族引用(,数据实际上是一个uint8_t。这意味着您的格式说明符和参数不匹配,导致未定义的行为。打印uint8_t的正确格式说明符是"%hhx",或者最好使用PRI8x宏:

uint8_t result = ...
printf("%" PRI8x "n", result);

例如,请参阅此格式宏参考。

最新更新