You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言打印char数组十六进制值去除ffffff前缀实现两位输出

问题原因

  • 你的系统中char默认是有符号字符类型,当MacAdd中存储的字节值大于0x7F(即十进制127)时,会被识别为负数
  • 可变参数函数sprintf/printf处理整型参数时会做整型提升,负数的符号位会扩展,最终输出时就会出现高位的ffffff前缀
  • 原有代码中手动追加\0的操作是多余的,sprintf格式化完成后会自动在字符串末尾补结束符

解决方法

方法1:修改格式说明符(最简单,无需改动结构体)

使用%hhx替代%x,这个格式符会明确告诉printf只读取参数的低8位,自动忽略高位扩展内容:

// 基础写法,输出对应十六进制值
sprintf(MAC, "%hhx:%hhx", Info->MacAdd[0], Info->MacAdd[1]);

// 更安全的防溢出写法,推荐使用
snprintf(MAC, sizeof(MAC), "%hhx:%hhx", Info->MacAdd[0], Info->MacAdd[1]);

如果需要保证输出始终是两位,不足两位时补前导0(比如数值为0x05时输出05而非5),可以把格式符改成%02hhx即可。

方法2:修改结构体成员类型为无符号字符

直接把MAC地址数组的类型改为unsigned char,从根源上避免符号扩展问题:

typedef struct Info
{
    unsigned char MacAdd[2];                      
} Info;

// 后续格式化可以直接用%x,也不会出现高位前缀
snprintf(MAC, sizeof(MAC), "%x:%x", Info->MacAdd[0], Info->MacAdd[1]);

方法3:手动做位掩码截取低8位

如果既不想改结构体也不想用%hhx(比如兼容非常老的编译器),可以手动和0xFF做与运算截取低8位:

snprintf(MAC, sizeof(MAC), "%x:%x", Info->MacAdd[0] & 0xFF, Info->MacAdd[1] & 0xFF);

内容的提问来源于stack exchange,提问作者GNK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:51:01