C语言打印的坑

使用下面的代码buf

cpp 复制代码
dprt("data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);

明明是一个字节一个字节的打,打出来的数据有些却是4个字节

cpp 复制代码
0xffffffff 0xffffffff 0xffffffff 0x7f 0xffffffff 0x7f

0xffffffff 0x7f 0xffffffff 0x7f 0xffffffff 0xffffffff

0xffffffff 0xffffffff 0xffffffff 0x7f 0xffffffff 0x7f

0x00 0x00 0x00 0x00 0x00 0x00

就很奇怪

可能的原因

  1. ch 的类型不匹配
    • 如果 ch 被声明为 char 类型,并且该字符的值在有符号 char 范围内表示为负数(例如,char 是有符号的,并且 ch 的值是 -1),那么在传递给 printf 时,可能会被提升为 int 类型,并进行符号扩展。
    • 在许多实现中,char 默认是有符号的,因此 -1 会被提升为 int 类型的 0xffffffff(在 32 位系统上)。
  2. 格式说明符不匹配
    • %02x 格式说明符期望一个 unsigned int 类型的参数(或至少一个可以隐式转换为 unsigned int 的参数),但 char 类型会被提升为 int
    • 如果 char 是有符号的且为负值,符号扩展会导致不期望的结果。

解决:

cpp 复制代码
//char* buf = (char*)param1;
uint32_t* data = (uint32_t*)param1;

//dprt("data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
dprt("data: 0x%08x 0x%08x", data[0], data[1]);

这样打印就正常了

cpp 复制代码
data: 0x837f037e 0x037f037f
data: 0x7e31fe31 Oxfe31fe31
data: Oxf4f674f6 0xf4f6f4f6
data: Ox797af97a 0x797a797a
data: Oxfb737b73 0xfb73fb73
data: 0x84850485 0x84858485
相关推荐
程序员曼布3 分钟前
ThreadLocal源码深度剖析:内存管理与哈希机制
java·开发语言·哈希算法
边疆.10 分钟前
【C++】模板进阶
开发语言·c++·模板
o0向阳而生0o18 分钟前
36、C#中的⽅法声明参数关键字params,ref,out的意义及⽤法
开发语言·c#·.net
遇见你的雩风29 分钟前
Java---Object和内部类
java·开发语言
我们的五年31 分钟前
【QT】QT安装
开发语言·qt
DonciSacer2 小时前
第一章-Rust入门
开发语言·后端·rust
冉佳驹2 小时前
C语言 ——— 函数
c语言·数据结构·学习·递归·函数·嵌套调用·链式访问
西京刀客2 小时前
golang常用库之-标准库text/template
开发语言·后端·golang
落榜程序员2 小时前
浅拷贝和深拷贝的区别
java·开发语言
purrrew3 小时前
【Java ee初阶】多线程(7)
java·开发语言