在下面的代码片段中,为什么我们得到的输出是 600?有两个问题将帮助我理解这种行为。
- 我将变量b的类型指定为uint8_t,为什么数学运算不限制为相同类型?
- 我认为 PRIu8 是打印 uint8_t 的正确类型,为什么这不起作用?
我希望得到答案 88,这是由于循环超出 uint8_t 范围而产生的
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void main()
{
uint8_t b = 200;
printf("%" PRIu8 "\n",b+b+b);
printf("%" PRIu8 "\n",3*b);
}
gcc版本9.4.0(Ubuntu 9.4.0-1ubuntu1~20.04.1)
最佳答案
在我看来,这是一个库错误。
在 MS Visual Studio 中,宏 PRIu8
按其应有的方式扩展为 hhu
,您将获得预期的结果。
有趣的是,如果使用 clang 那么如果你会写例如
printf("%" PRIu8 "\n",( uint8_t)(b+b+b));
什么时候你会再次得到预期的结果。
关于c - Printf 执行隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76019216/