打印

关于乘法的问题

[复制链接]
3958|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Rain_King|  楼主 | 2013-11-23 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
特简单的一个问题,昨天搞了半天,虽然最后采用其他的方法解决了,但是必须要把这个给弄明白......
unsigned long Tem;

Tem=4000*50;
和Tem=4000*3;

下载到程序里面运行,为啥第一个计算出来的值大的非常大,第二个算出来是正确的......这个怎么解释,注意我的Tem是32位变量。。。。
沙发
wangch_sh| | 2013-11-23 14:25 | 只看该作者
感觉是编译器的问题。

使用特权

评论回复
板凳
yklstudent| | 2013-11-23 22:22 | 只看该作者
4000ul*50 感觉这样就应该没什么问题 应该还是编译器的问题

使用特权

评论回复
地板
秋雨| | 2013-11-23 22:39 | 只看该作者
picc不指名类型的话按照int*int=int型计算,不会进行隐性转换,超过的丢弃。需要像楼上这样加L才可

使用特权

评论回复
5
Rain_King|  楼主 | 2013-11-25 08:14 | 只看该作者
秋雨 发表于 2013-11-23 22:39
picc不指名类型的话按照int*int=int型计算,不会进行隐性转换,超过的丢弃。需要像楼上这样加L才可 ...

按照你的意思是需要这样Tem=(unsigned long)4000*50????

使用特权

评论回复
6
Rain_King|  楼主 | 2013-11-25 08:15 | 只看该作者
yklstudent 发表于 2013-11-23 22:22
4000ul*50 感觉这样就应该没什么问题 应该还是编译器的问题

为啥说是编译器问题???解释一下具体的原因....

使用特权

评论回复
7
Rain_King|  楼主 | 2013-11-25 08:15 | 只看该作者
wangch_sh 发表于 2013-11-23 14:25
感觉是编译器的问题。

可否解释一下???、

使用特权

评论回复
8
wangch_sh| | 2013-11-25 08:32 | 只看该作者
不好解释。因为4000有符号数也是正的,所以不加应该也可以。不是编译器的问题解释不通。

使用特权

评论回复
9
Rain_King|  楼主 | 2013-11-25 08:35 | 只看该作者
wangch_sh 发表于 2013-11-25 08:32
不好解释。因为4000有符号数也是正的,所以不加应该也可以。不是编译器的问题解释不通。 ...


我还把所有的写成0X0FA0*0X0032,以表示都是16位数据相乘,还有我把50改为30也出现错误,继续往下该没有试过.....

使用特权

评论回复
10
Rain_King|  楼主 | 2013-11-25 08:38 | 只看该作者
秋雨 发表于 2013-11-23 22:39
picc不指名类型的话按照int*int=int型计算,不会进行隐性转换,超过的丢弃。需要像楼上这样加L才可 ...


我理解你的意思了...可是有一个问题没有解释啊....超过int会丢掉,可是32位的高16位数据应该是0啊,结果不应该会超过65536啊.......可是我发现值非常大啊.....

使用特权

评论回复
11
yewuyi| | 2013-11-25 09:44 | 只看该作者
1、unsigned long int Tem=0;尽量写全了,否则各个编译器定义方法不一样,容易掉坑。
2、Tem=(unsigned long int)4000*50;尽量加上强制转换类型符
3、如果可以,可以再加上Volatile试试,这样可以防止代码结构混乱造成编译器优化时使用了中间变量造成错误运算。

使用特权

评论回复
12
Rain_King|  楼主 | 2013-11-25 09:48 | 只看该作者
yewuyi 发表于 2013-11-25 09:44
1、unsigned long int Tem=0;尽量写全了,否则各个编译器定义方法不一样,容易掉坑。
2、Tem=(unsigned lon ...

好的习惯可以避免很多基础的问题.....学习了。unsigned long long有这个存在么???这个是啥子??和unsigned long int一样么....

使用特权

评论回复
13
ayb_ice| | 2013-11-25 09:53 | 只看该作者
本帖最后由 ayb_ice 于 2013-11-25 09:54 编辑

计算溢出了,自动截断了
编译器是无辜的

使用特权

评论回复
14
yewuyi| | 2013-11-25 09:56 | 只看该作者
Rain_King 发表于 2013-11-25 09:48
好的习惯可以避免很多基础的问题.....学习了。unsigned long long有这个存在么???这个是啥子??和uns ...

你从那冒出来的:unsigned long long,是不是下面就unsigned long long ago...

使用特权

评论回复
15
Rain_King|  楼主 | 2013-11-25 10:04 | 只看该作者
yewuyi 发表于 2013-11-25 09:56
你从那冒出来的:unsigned long long,是不是下面就unsigned long long ago...

不是我从哪里冒出来的啊,是前一个工程师里的程序里面的啊,理解了好久,都不知道这个是啥玩意啊,如下图:

使用特权

评论回复
16
Rain_King|  楼主 | 2013-11-25 10:06 | 只看该作者
ayb_ice 发表于 2013-11-25 09:53
计算溢出了,自动截断了
编译器是无辜的

可是有一点无法解释啊...既然截断了,高的16位数据应该是0吧,可是我发现结果非常大,远远超过了65536

使用特权

评论回复
17
ayb_ice| | 2013-11-25 10:11 | 只看该作者
本帖最后由 ayb_ice 于 2013-11-25 10:15 编辑

4000*50=200000=0x30d40
截断了应该等于0x0d40
如果不等于,只能看反汇编了

结果到底是多少呢

其实也没有必要追究了,因为你的程序本身就写的有问题,这是问题本质

使用特权

评论回复
18
Rain_King|  楼主 | 2013-11-25 10:16 | 只看该作者
本帖最后由 Rain_King 于 2013-11-25 10:18 编辑
ayb_ice 发表于 2013-11-25 10:11
4000*50=200000=0x30d40
截断了应该等于0x0d40
如果不等于,只能看反汇编了


因为问题我已经采用其他方式解决了,所以没法再去还原了。我的显示屏只能显示6位的,我记得我显示的时候是除1000的,还有5位数据显示出来,貌似显示的是42986,前面的4是一定的,后面的4位有点模糊.....但是不管怎么样,这个值都是40000000以上啊........还有看汇编的时候,如何找到指定语句的汇编啊....不可能从头看到尾吧...

使用特权

评论回复
19
ayb_ice| | 2013-11-25 10:27 | 只看该作者
刚才在同事的电脑上模拟了(就是PIC+MPLAB),结果就是0x0d40,符合标准C的结果

使用特权

评论回复
20
Rain_King|  楼主 | 2013-11-25 10:29 | 只看该作者
ayb_ice 发表于 2013-11-25 10:27
刚才在同事的电脑上模拟了(就是PIC+MPLAB),结果就是0x0d40,符合标准C的结果
...

难道是我的比较特殊??我也不纠结这个问题了,能否告知怎么看特定语句的汇编啊....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:努力学习,积极回复,只为申请版主.......

29

主题

784

帖子

4

粉丝