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
相关推荐
隐积11 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
名字还没想好☜14 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏15 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
酷在前行16 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
cxr82816 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
2601_9555181817 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·标准演化·ansic·性能与可移植性
废弃的小码农17 小时前
功能测试--Day07--Python编程基础
开发语言·python
fengci.17 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
程序员zgh18 小时前
C++ 拷贝赋值运算符 详解
c语言·开发语言·c++
念何架构之路18 小时前
restartmanager-重启管理子系统
java·开发语言