32位 数据转换 问题
要用到32位乘除法和单精度浮点数计算;目前遇到无法转换的问题,本来新手一枚,望高手指点下单片机用的是STC32G12K128
volatile unsignedlong int near aaa1;
unsignedlong intaaa2;
float data date1,date2;
aaa1=8000;
aaa2=8000;
date1=(float)aaa1;
date2=(float)aaa2;
运行后,date1不等于8000,date2等于8000
因需要用到32位乘除法 ,无法更换变量类型,如何处理,本来新手一枚,望高手指点下
找到问题了,用KEIL软件仿真时出错,下载到单片机里,计算正常。。。STC的32位计算不适合在KeiL软件仿真,要买个硬件仿真 多发表些应用感悟,工具免费送你 用KEIL软件仿真时出错====32位乘除法, STC32G12K128是硬件 32位乘除
unsignedlong edata aaa1;
unsignedlong edata aaa2;
float edata date1,date2;
aaa1=8000;
aaa2=8000;
date1=(float)aaa1;
date2=(float)aaa2;
注意,转成浮点数后,可能不会是整数,比如123转成浮点数,可能会是122.999999。 梁工 发表于 2023-1-9 11:44
unsignedlong edata aaa1;
unsignedlong edata aaa2;
float edata date1,date2;
长整数(long) 结尾 应加 L
否则 Keil 作整数(int)处理
楼主的问题出在,赋值时 未加 L!!!
改成这样:
aaa1=8000lL;
aaa2=8000L;
软件仿真和硬件仿真都能正确通过。 vae66666 发表于 2023-1-8 17:45
找到问题了,用KEIL软件仿真时出错,下载到单片机里,计算正常。。。STC的32位计算不适合在KeiL软件仿真, ...
问题没找到!
问题原因是由楼主的赋值错误引起的
就算硬件仿真通过(芯片初始化将变量全部清 0),所以看上去结果是正确的,实际上是错误的!
8000 < 65535 (int整数),所以结果可能正确, 但是
不信你将 8000 改为 800000 试试~~~ LAOXU 发表于 2023-1-13 07:45
长整数(long) 结尾 应加 L
否则 Keil 作整数(int)处理
你给的值是8000,不超过65535,所以不需要加L或UL,超过65536才要加L或UL。 梁工 发表于 2023-1-13 11:46
你给的值是8000,不超过65535,所以不需要加L或UL,超过65536才要加L或UL。
ok, 正确.
我把楼主的示例程序, 拷贝到项目中, 用 Keil 软件仿真运行, 结果正确.
不知楼主怎么会得出不正确的结果, 应该是有某个地方 疏忽了.
页:
[1]
2