尝试打印数组元素,如下面
typedef struct Info
{
char MacAdd[2];
} Info;
char MAC[100];
sprintf(MAC, "%x:%x%c", Info->MacAdd[0], Info->MacAdd[1],' ');
printf("MAC %s",MAC);
得到的输出是——>ffffff98: ffffffa4
如何得到像——>98: a4
Info
结构中的MacAdd
数组被声明为char
数组。但char
通常是符号类型。
当你调用printf
时,某些"默认参数转换"发生。其中,类型char
被提升为int
。由于0x98作为有符号字符实际上是负的(它是-104),因此当发生这种情况时,它会自动扩展符号—这就是额外的ff
的来源。ffffff98
是-104的32位有符号版本,因此保留该值。
至少有三种方法可以解决这个问题,按照我认为最不吸引人的顺序:
- 将
MacAdd
数组重新声明为unsigned char
数组 - 将printf格式更改为
"%hhx:%hhx"
。hh
告诉printf
你的值原来是一个char
,这要求printf
撤销提升,实际上,剥离不需要的ff
的back。 - 将呼叫改为
sprintf(MAC, "%x:%x", Info->MacAdd[0] & 0xff, Info->MacAdd[1] & 0xff);
正如@Aconcagua在评论中指出的那样,一旦你去掉了ff
,你可能还需要稍微调整一下你的printf格式,以处理个位数地址。
脚注:上面的解决方案3相当糟糕,我不会认真推荐它。这是我们在Ritchie最初的C编译器时代使用的,当时unsigned char
和%hhx
都还没有被发明。