【问题标题】:printing the uint8_t打印 uint8_t
【发布时间】:2013-01-16 22:07:56
【问题描述】:

我有uint8_t orig[ETH_ALEN];

如何使用__printf(3, 4) 打印它

定义为#define __printf(a, b) __attribute__((format(printf, a, b)))

Orig 应该是以太网硬件地址。

【问题讨论】:

标签: c debugging


【解决方案1】:

使用 C99 格式说明符:

#include <inttypes.h>

printf("%" PRIu8 "\n", orig[0]);

【讨论】:

  • 我认为您缺少宏之前的“%”。
  • 在VC2013中定义为%u
【解决方案2】:

您需要构造一个合适的格式字符串。 printf()函数没有办法一次性打印一个数组,所以需要拆分并打印每个uint8_t

__printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
         orig[0] & 0xff, orig[1] & 0xff, orig[2] & 0xff,
         orig[3] & 0xff, orig[4] & 0xff, orig[5] & 0xff);

&amp; 0xff是保证onlu 8位发送到printf();对于像uint8_t 这样的无符号类型,它们不应该是必需的,因此您也可以尝试不使用它们。

这假定一个常规的 48 位 MAC,并使用 conventional 冒号分隔的十六进制样式打印。

【讨论】:

  • uint8_t 保证只有 8 位,因此不需要掩码。但是,即使那样,仍然会发送超过 8 位,因为 printf 是可变参数,所以它们都将被提升为 unsigned int
  • @dreamlax uint8_t 的所有值都可以表示为 int,因此整数提升 [以及因此默认参数提升] 将提升 uint8_tint
  • @DanielFischer:哦,这就是我的意思……unsigned 不知从何而来。我的意思是由于整数提升,将为 printf 提供超过 8 位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 2019-10-24
  • 2020-06-24
相关资源
最近更新 更多