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 数据 0x0872 ,d 刚好为通道 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 |

浙公网安备 33010602011771号