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
相关推荐
Gerardisite21 小时前
如何在微信个人号开发中有效管理API接口?
java·开发语言·python·微信·php
Want59521 小时前
C/C++跳动的爱心①
c语言·开发语言·c++
lingggggaaaa1 天前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
coderxiaohan1 天前
【C++】多态
开发语言·c++
gfdhy1 天前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
Eiceblue1 天前
通过 C# 将 HTML 转换为 RTF 富文本格式
开发语言·c#·html
故渊ZY1 天前
Java 代理模式:从原理到实战的全方位解析
java·开发语言·架构
我不会插花弄玉1 天前
vs2022调试基础篇【由浅入深-C语言】
c语言
leon_zeng01 天前
Qt Modern OpenGL 入门:从零开始绘制彩色图形
开发语言·qt·opengl
会飞的胖达喵1 天前
Qt CMake 项目构建配置详解
开发语言·qt