找回密码
 立即注册
查看: 59|回复: 7

AI8051U的printf_usb格式(%d,%u,%x等)输出大于16位的数据时会被截断成16位数据

[复制链接]
已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2026-8-31 16:48:22 | 显示全部楼层 |阅读模式
printf_usb("%x\n",(u32)(65536+10));  //实际输出:a
printf_usb("%d\n",(u32)(65536+10));  //实际输出:10
printf_usb("%.0f\n",(float)(65536+10));   //实际输出:65546
printf_usb("%.2f\n",(float)(65536+10));   //实际输出:65546.00
回复

使用道具 举报 送花

11

主题

144

回帖

1373

积分

金牌会员

积分
1373
发表于 2026-8-31 17:08:39 | 显示全部楼层
x和d好像是16位输出吧,你试试lx和ld

点评

谢谢,经测试,你的方法是正确的  发表于 2026-8-31 22:50
微信qsssuv
回复

使用道具 举报 送花

33

主题

3077

回帖

7166

积分

论坛元老

积分
7166
发表于 2026-8-31 17:59:10 | 显示全部楼层
编译器问题。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

83

主题

8216

回帖

1万

积分

超级版主

积分
17634
发表于 2026-8-31 18:11:33 | 显示全部楼层
KEIL默认是16位的。比如:
printf_usb("%x\n",(u32)(65536+10));  //实际输出:a
编译器先计算(65536+10),结果为16位,所以你得到10,再强转为32位。
你应该这样写,先强转为无符号32位再加:
printf_usb("%x\n",((u32)65536+10));
或者这样写:
printf_usb("%x\n", (65536UL+10);



点评

二楼的处理方法,输出结果是正确的。  发表于 2026-8-31 22:49
回复

使用道具 举报 送花

已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2026-8-31 22:47:54 | 显示全部楼层
青穗*** 发表于 2026-8-31 17:08
x和d好像是16位输出吧,你试试lx和ld

经测试,你的方法是正确的
printf_usb("%lx\n",65546UL); //实际输出:1000a,正确
printf_usb("%ld\n",65546UL); //实际输出:65546,正确
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-22 06:03 , Processed in 0.073080 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表