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

32位 数据转换 问题

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-02 21:44:21
已绑定手机

10

主题

42

回帖

501

积分

高级会员

积分
501
发表于 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位乘除法 ,无法更换变量类型,如何处理,本来新手一枚,望高手指点下
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-02 21:44:21
已绑定手机

10

主题

42

回帖

501

积分

高级会员

积分
501
发表于 2023-1-8 17:45:11 | 显示全部楼层
找到问题了,用KEIL软件仿真时出错,下载到单片机里,计算正常。。。STC的32位计算不适合在KeiL软件仿真,要买个硬件仿真
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-1-8 18:40:38 | 显示全部楼层
多发表些应用感悟,工具免费送你
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-1-8 18:42:38 | 显示全部楼层
用KEIL软件仿真时出错====32位乘除法, STC32G12K128是硬件 32位乘除
1.png
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 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。
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

问题没找到!

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

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

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

不信你将 8000 改为 800000 试试~~~
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

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

否则 Keil 作整数(int)处理

你给的值是8000,不超过65535,所以不需要加L或UL,超过65536才要加L或UL。
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

ok, 正确.

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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


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


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

本版积分规则

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

GMT+8, 2025-5-3 12:47 , Processed in 0.175667 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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