找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 507|回复: 8
收起左侧

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

[复制链接]
ID:235200 发表于 2023-11-25 13:14 | 显示全部楼层 |阅读模式
调试超声波测距程序时,由测得的时间计算距离时发生错误,单片机程序如下:

#include <stc15.h>

void main()
{
        unsigned int i;
        unsigned long S;
        unsigned int Time;
        AUXR &= 0x7F;                //定时器时钟12T模式 12M晶振机器周期1us
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                  //设置定时初值
        TH0 = 0x00;                  //设置定时初值
        TF0 = 0;                    //清除TF0标志
        
        TR0 = 0;                    //定时器0开始计时
        ET0 = 0;
        EA = 1;                      //使能
        
        TR0=1;          //启动计数
        for (i=0;i<500;i++);                //模拟测量时间
        TR0=0;
        Time=TH0*256+TL0;
        TH0=0;
        TL0=0;
        S=(Time*17)/1000;      //计算距离(此计算结果不对,原因是S不能保存32位结果)
        
}

/*偿试使用 S=((Time<<4)+Time)/1000;也不对
    但使用 S=(_lrol_(Time,4)+Time)/1000;就对了*/

44.png
回复

使用道具 举报

ID:883242 发表于 2023-11-25 15:21 | 显示全部楼层
S=Time;
S=((S<<4)+S)/1000;
回复

使用道具 举报

ID:526108 发表于 2023-11-25 19:58 | 显示全部楼层
S=((S<<4)+S>>4)/1000;
回复

使用道具 举报

ID:235200 发表于 2023-11-25 20:50 | 显示全部楼层

这样确实也对,但很多程序中均用S=(Time*17)/1000;来计算,他们是如何实现的?但我的为何不能实现?这个表达式的关键问题在哪里?
回复

使用道具 举报

ID:235200 发表于 2023-11-25 20:51 | 显示全部楼层

Keil中还隐藏着不为人知的一面吗?
回复

使用道具 举报

ID:1034262 发表于 2023-11-25 21:27 | 显示全部楼层
S=(Time*17)/1000; 中Time为16位,*17有可能溢出导致不对。你用32为的Time试试。
回复

使用道具 举报

ID:883242 发表于 2023-11-25 21:34 | 显示全部楼层
csmyldl 发表于 2023-11-25 20:50
这样确实也对,但很多程序中均用S=(Time*17)/1000;来计算,他们是如何实现的?但我的为何不能实现?这个 ...

Time溢出了呗。
回复

使用道具 举报

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: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位就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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