【全文大纲】 : https://blog.youkuaiyun.com/Engineer_LU/article/details/135149485
1 . 前言总结
平台调试用到 printf 接口打印一些数据,但是由于printf用到可变形参的概念,又由于KeilC51为8位平台,当我们在可变形参传入8位,16位,32位变量时,printf接口是不知道的,因为不像MDK平台是32位地址操作,因此需要在%d中加入对应类型修饰。
2 . 问题现象
以下打印会出现异常,因为printf在运行过程中不知道i是一个16位变量
u16 i = 0x55AA;
printf("value = %d",i);
3 . 解决思路
为了解决以上问题,可把%d改成%hd来修饰,告诉printf在运行过程中,第一个参数是16位变量。若是参数为8位则选择%bd,16位%hd,32位%ld
u16 i = 0x55AA;
printf("value = %hd",i);
4 . 扩展
-
符号作用描述
符号 作用 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 -
而KeilC51扩展出了b,h,l来对输入字节宽的设置:
扩展字符 位数 b 8位 h 16位 l 32位
5 . 总结
本文秉持深入浅出风格展示内容,以上内容可了解到由于KeilC51是8位平台,可变形参并不知道传入的参数的几位的,因此协会标准制定了一个传入位数扩展字符,因此在8位平台里要留意printf的打印输出扩展字符。
技术交流群 : 745662457
群内专注 - 问题答疑,技术研究