打印 uint8_t

9

我有一个uint8_t orig[ETH_ALEN];

我该如何使用__printf(3, 4)来打印它?

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

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


2
%u适用于任何uintN_t,我认为,至少适用于uint8_t - rvighne
2
可能是uint8_t,uint16_t等的格式说明符?的重复问题。 - phuclv
2个回答

21
使用C99格式说明符:
#include <inttypes.h>

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

3
我认为你漏掉了宏前面的“%”符号。 - Jens Gustedt
在VC2013中,它被定义为%u。 - Tanguy

12
你需要构建一个合适的格式字符串。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);

& 0xff 是为了确保只发送8位到 printf();但对于无符号类型如 uint8_t,这些可能是不需要的,所以你可以尝试不用它们。

这假设是一个常规的48位MAC,并使用传统的冒号分隔的十六进制样式进行打印。


1
uint8_t 保证只有8位,因此掩码是不必要的。但即使如此,由于 printf 是可变参数的,所以会发送超过8位的内容,因为它们都将被提升为 unsigned int - dreamlax
1
@dreamlax 所有 uint8_t 的值都可以表示为 int,因此整数提升[以及默认参数提升]将把 uint8_t 提升为 int - Daniel Fischer
@DanielFischer:糟糕,这就是我想表达的...这个“无符号”从哪里冒出来的?我的意思是由于整数提升,printf将会给出超过8位的值。 - dreamlax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接