找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

KEIL C语言中32位无符号数的存储问题

查看数: 1743 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-11-25 13:14

正文摘要:

调试超声波测距程序时,由测得的时间计算距离时发生错误,单片机程序如下: #include <stc15.h> void main() {         unsigned int i;       &nb ...

回复

ID:235200 发表于 2023-11-26 13:33
coody_sz 发表于 2023-11-25 21:27
S=(Time*17)/1000; 中Time为16位,*17有可能溢出导致不对。你用32为的Time试试。

这样的话,其实程序中变量S没有必要定义为32位,只需Time定义为32位就可以了
ID:235200 发表于 2023-11-26 13:29
coody_sz 发表于 2023-11-25 21:27
S=(Time*17)/1000; 中Time为16位,*17有可能溢出导致不对。你用32为的Time试试。

确实是这样,原来Time*17的结果仍然是存放在Time中,不是存放在S中,所以造成溢出丢失,所以把Time变量也改为32位就对了。谢谢各位的帮助!
ID:883242 发表于 2023-11-25 21:34
csmyldl 发表于 2023-11-25 20:50
这样确实也对,但很多程序中均用S=(Time*17)/1000;来计算,他们是如何实现的?但我的为何不能实现?这个 ...

Time溢出了呗。
ID:1034262 发表于 2023-11-25 21:27
S=(Time*17)/1000; 中Time为16位,*17有可能溢出导致不对。你用32为的Time试试。
ID:235200 发表于 2023-11-25 20:51

Keil中还隐藏着不为人知的一面吗?
ID:235200 发表于 2023-11-25 20:50

这样确实也对,但很多程序中均用S=(Time*17)/1000;来计算,他们是如何实现的?但我的为何不能实现?这个表达式的关键问题在哪里?
ID:526108 发表于 2023-11-25 19:58
S=((S<<4)+S>>4)/1000;
ID:883242 发表于 2023-11-25 15:21
S=Time;
S=((S<<4)+S)/1000;

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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