找回密码
 立即注册
查看: 1628|回复: 13

32位 数据转换 问题

[复制链接]
  • TA的每日心情
    开心
    2024-5-6 13:35
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    123

    积分

    注册会员

    积分
    123
    发表于 2023-1-8 14:20:52 | 显示全部楼层 |阅读模式
    要用到32位乘除法和单精度浮点数计算;目前遇到无法转换的问题,本来新手一枚,望高手指点下
    单片机用的是STC32G12K128


    volatile unsigned  long int near aaa1  ;
    unsigned  long int  aaa2;
    float data date1,date2;

    aaa1=8000;
    aaa2=8000;
    date1=(float)aaa1;
    date2=(float)aaa2;
    运行后,date1不等于8000,date2等于8000



    因需要用到32位乘除法 ,无法更换变量类型,如何处理,本来新手一枚,望高手指点下
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-6 13:35
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    5

    主题

    32

    回帖

    123

    积分

    注册会员

    积分
    123
     楼主| 发表于 2023-1-8 17:45:11 | 显示全部楼层
    找到问题了,用KEIL软件仿真时出错,下载到单片机里,计算正常。。。STC的32位计算不适合在KeiL软件仿真,要买个硬件仿真

    该用户从未签到

    551

    主题

    9428

    回帖

    1万

    积分

    管理员

    积分
    14003
    发表于 2023-1-8 18:40:38 | 显示全部楼层
    多发表些应用感悟,工具免费送你

    该用户从未签到

    551

    主题

    9428

    回帖

    1万

    积分

    管理员

    积分
    14003
    发表于 2023-1-8 18:42:38 | 显示全部楼层
    用KEIL软件仿真时出错====32位乘除法, STC32G12K128是硬件 32位乘除
    1.png

    该用户从未签到

    46

    主题

    3006

    回帖

    6777

    积分

    超级版主

    积分
    6777
    发表于 2023-1-9 11:44:21 | 显示全部楼层
    unsigned  long edata aaa1;
    unsigned  long edata aaa2;
    float edata date1,date2;

    aaa1=8000;
    aaa2=8000;
    date1=(float)aaa1;
    date2=(float)aaa2;

    注意,转成浮点数后,可能不会是整数,比如123转成浮点数,可能会是122.999999。
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    37

    主题

    874

    回帖

    4018

    积分

    荣誉版主

    积分
    4018
    发表于 2023-1-13 07:45:16 | 显示全部楼层
    梁工 发表于 2023-1-9 11:44
    unsigned  long edata aaa1;
    unsigned  long edata aaa2;
    float edata date1,date2;

    长整数(long) 结尾 应加 L

    否则 Keil 作整数(int)处理

    楼主的问题出在,赋值时 未加 L  !!!

    改成这样:
    aaa1=8000lL;
    aaa2=8000L;

    软件仿真和硬件仿真都能正确通过。

    点评

    你给的值是8000,不超过65535,所以不需要加L或UL,超过65536才要加L或UL。  详情 回复 发表于 2023-1-13 11:46
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    37

    主题

    874

    回帖

    4018

    积分

    荣誉版主

    积分
    4018
    发表于 2023-1-13 08:23:23 | 显示全部楼层
    vae66666 发表于 2023-1-8 17:45
    找到问题了,用KEIL软件仿真时出错,下载到单片机里,计算正常。。。STC的32位计算不适合在KeiL软件仿真, ...

    问题没找到!

    问题原因是由楼主的赋值错误引起的

    就算硬件仿真通过(芯片初始化将变量全部清 0),所以看上去结果是正确的,实际上是错误的!

    8000 < 65535 (int整数),所以结果可能正确, 但是

    不信你将 8000 改为 800000 试试~~~

    该用户从未签到

    46

    主题

    3006

    回帖

    6777

    积分

    超级版主

    积分
    6777
    发表于 2023-1-13 11:46:53 | 显示全部楼层
    LAOXU 发表于 2023-1-13 07:45
    长整数(long) 结尾 应加 L

    否则 Keil 作整数(int)处理

    你给的值是8000,不超过65535,所以不需要加L或UL,超过65536才要加L或UL。
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    37

    主题

    874

    回帖

    4018

    积分

    荣誉版主

    积分
    4018
    发表于 2023-1-13 11:54:32 | 显示全部楼层
    梁工 发表于 2023-1-13 11:46
    你给的值是8000,不超过65535,所以不需要加L或UL,超过65536才要加L或UL。

    ok, 正确.

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    37

    主题

    874

    回帖

    4018

    积分

    荣誉版主

    积分
    4018
    发表于 2023-1-13 12:07:58 | 显示全部楼层
    我把楼主的示例程序, 拷贝到项目中, 用 Keil 软件仿真运行, 结果正确.


    不知楼主怎么会得出不正确的结果, 应该是有某个地方 疏忽了.


    未命名.JPG
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-14 20:17 , Processed in 0.107334 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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