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
相关推荐
望获linux3 分钟前
【Linux基础知识系列】第六十四篇 - 了解Linux的硬件架构
linux·运维·服务器·开发语言·数据库·操作系统·嵌入式软件
一匹电信狗13 分钟前
【C++】手搓一个STL风格的vector容器
c语言·数据结构·c++·算法·leetcode·stl·visual studio
小小小白的编程日记25 分钟前
C语言中的数据结构--栈和队列(2)
c语言·数据结构
李永奉33 分钟前
C语言-数组:数组(定义、初始化、元素的访问、遍历)内存和内存地址、数组的查找算法和排序算法;
c语言·算法·排序算法
1candobetter1 小时前
JAVA后端开发——用 Spring Boot 实现定时任务
java·开发语言·spring boot
啊阿狸不会拉杆2 小时前
《Java 程序设计》第 8 章 - Java 常用核心类详解
java·开发语言·python·算法·intellij-idea
小白学大数据2 小时前
Python + Requests库爬取动态Ajax分页数据
开发语言·python·ajax·okhttp
2501_920047032 小时前
python-内存管理
开发语言·jvm·python
芜青2 小时前
JavaScript手录09-内置对象【String对象】
开发语言·javascript·ecmascript
钮钴禄·爱因斯晨2 小时前
Java 集合进阶:从 Collection 接口到迭代器的实战指南
java·开发语言