c - Printf 执行隐式转换

标签 c printf unsigned-char conversion-specifier

在下面的代码片段中,为什么我们得到的输出是 600?有两个问题将帮助我理解这种行为。

  1. 我将变量b的类型指定为uint8_t,为什么数学运算不限制为相同类型?
  2. 我认为 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/

相关文章:

c++ - 如何从 C++ 中安全地转义字符串

c - 为什么以下代码给出运行时错误 SIGSEGV

string - 在 Octave 中实现 Matlab 的 `num2str` 行为

c++ - 如何冲刺一个未签名的字符?

c - C的一个小问题

C 初学者,指针和取消引用

c - 需要有非阻塞的命名管道,能够在 Linux 上的 c 中进行双向通信

c - 初学者关于C中fopen的另一个问题

c++ - 在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short