一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
12
返回列表 发新帖
楼主: Kowalski
收起左侧

[51单片机] 请教一下高手:关于数值的乘法运算问题

[复制链接]
 楼主| 发表于 2018-4-23 20:02 | 显示全部楼层
Joe_Black 发表于 2018-4-22 17:08
很多年没写C。
这样可以吗:b=(long)a*100

但是,具体是因为什么原因呢?数据溢出么?可是unsigned int的值乘以100也不会超过llong的取值范围吧
 楼主| 发表于 2018-4-23 20:13 | 显示全部楼层
感谢大家的解答,使用二楼的方法已经解决问题,我就不一一回复大家了,在此感谢各位了!另外,我使用的是KEIL4,编译的时候并未报错,只是下载到单片机里面以后不能输出正确的结果,所以我才上来问。
发表于 2018-4-23 21:41 | 显示全部楼层
本帖最后由 junyee 于 2018-4-23 21:55 编辑
devcang 发表于 2018-4-23 09:54
因为楼主没有具体说明编译的环境,所以,随意拿个编译器来试试。。。。。。。就楼主提供的代码,a未 ...

你这个代码,,, 1*100 没有溢出啊.
如果用
  1. unsigned char a=100;
  2. unsigned long b;

  3. b = a * 100;
复制代码


再看看会不出溢出?

c=a*b
编译器默认情况下会将 a,b 强转为两个当较大的一个.
除了加上  sort, long .....之类的强制转换修饰,
如果有常数的话,可以在常数尾加上 L 代表(long)类型,作用应该是一样的.
不同的编译环境下这个并不确定, 应该各有设置的地方.

做乘法加法或整数转浮点运算都要注意这一点.
使用2楼的方法比较好.


发表于 2018-4-24 08:40 | 显示全部楼层
Kowalski 发表于 2018-4-23 20:02
但是,具体是因为什么原因呢?数据溢出么?可是unsigned int的值乘以100也不会超过llong的取值范围吧

问题在于在计算a*100的时候,一般都是按unsigned int的字长来计算的,计算完之后才转换成long
发表于 2018-4-24 21:55 | 显示全部楼层
icewind 发表于 2018-4-24 08:40
问题在于在计算a*100的时候,一般都是按unsigned int的字长来计算的,计算完之后才转换成long

但是计算结果并没有溢出,为什么结果会是错误的?
发表于 2018-4-25 09:04 | 显示全部楼层
40560335 发表于 2018-4-24 21:55
但是计算结果并没有溢出,为什么结果会是错误的?

A的值是多少,实际输出值是多少?

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-30 03:23 , Processed in 0.046216 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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