STC8H printf 变量输出问题

问题描述

使用 printf 输出数据时,打印内容与变量类型不符

u8 ch; u16 da;
// ch 为通道,固定为13(0x0d)
// da 为数据,16位
printf("ch = %x , da = 0x%04x\n", ch, da);
/*
-> ch = d08 , da = 0x7201
*/

08 应该与 72 构成 da 数据 0x0872d 刚好为通道 13

环境信息

芯片:STC8H1K08T
环境:keil C51

解决方案

printf("ch = 0x%bx,da = 0x%hx\n", ch, da);

// ch = 0xd , da = 0x0872

原因分析

Keil C51 的 printf 与标准 C 不同,不会自动识别变量类型;
8/16/32 位变量入栈长度不匹配,直接用 %d / %x 会导致数据读取错位、溢出
这是51 单片机小端模式 + 栈内存规则导致的。

防止再发

变量类型 数据位宽 十进制占位符 十六进制占位符
char / unsigned char / u8 8 位 %bd %bx
int / unsigned int / u16 16 位 %hd %hx
long / unsigned long / u32 32 位 %ld %lx

参考资料

STC printf打印 char问题 - XZHDJH - 博客园

posted @ 2026-04-20 19:46  落子叶初LQ  阅读(23)  评论(0)    收藏  举报