发新帖我要提问
12
返回列表
打印

关于乘法的问题

[复制链接]
楼主: Rain_King
手机看帖
扫描二维码
随时随地手机跟帖
21
ayb_ice| | 2013-11-25 10:30 | 只看该作者 回帖奖励 |倒序浏览
通过这几天的帖子,感觉LZ的程序BUG颇多,还总是怀疑编译器有问题,这个态度有些问题

使用特权

评论回复
22
yewuyi| | 2013-11-25 10:33 | 只看该作者
Rain_King 发表于 2013-11-25 10:29
难道是我的比较特殊??我也不纠结这个问题了,能否告知怎么看特定语句的汇编啊.... ...

在编译之后,打开MPLAB的反汇编窗口,里面有对应的C代码和汇编代码。

使用特权

评论回复
23
Rain_King|  楼主 | 2013-11-25 10:40 | 只看该作者
ayb_ice 发表于 2013-11-25 10:30
通过这几天的帖子,感觉LZ的程序BUG颇多,还总是怀疑编译器有问题,这个态度有些问题
...

我从木有怀疑编译器的问题啊.....我只是想搞明白为啥???还有我知道怎么看特定语句的汇编了....乱点点出来的.....:lol

使用特权

评论回复
24
Rain_King|  楼主 | 2013-11-25 10:45 | 只看该作者
yewuyi 发表于 2013-11-25 10:33
在编译之后,打开MPLAB的反汇编窗口,里面有对应的C代码和汇编代码。

好吧....我乱点点出来了......:lol

使用特权

评论回复
25
yewuyi| | 2013-11-25 10:53 | 只看该作者
Rain_King 发表于 2013-11-25 10:04
不是我从哪里冒出来的啊,是前一个工程师里的程序里面的啊,理解了好久,都不知道这个是啥玩意啊,如下图 ...

发言要有继承,不要突然冒出一句,搞的我以为自己打错字了。


在有一些编译器中确实有unsingen long long int这种写法,这种写法一般就等效于长整型。

PICC上,我没试过,不确定是否有。

使用特权

评论回复
26
Rain_King|  楼主 | 2013-11-25 11:19 | 只看该作者
yewuyi 发表于 2013-11-25 10:53
发言要有继承,不要突然冒出一句,搞的我以为自己打错字了。

额.....好吧.....以后注意...

使用特权

评论回复
27
yklstudent| | 2013-11-25 11:53 | 只看该作者
CCSC编译器有unsigned long long这种写法,其它不了解
MPLAB X编译环境下,软件仿真楼主的写法 感觉现实的值老是不正确 不知道什么原因

使用特权

评论回复
28
Rain_King|  楼主 | 2013-11-25 13:52 | 只看该作者
yklstudent 发表于 2013-11-25 11:53
CCSC编译器有unsigned long long这种写法,其它不了解
MPLAB X编译环境下,软件仿真楼主的写法 感觉现实的 ...

你没有看我和他们讨论的过程么....我都已经知道原因了,你不知道么???

使用特权

评论回复
29
yklstudent| | 2013-11-25 19:40 | 只看该作者
Rain_King 发表于 2013-11-25 13:52
你没有看我和他们讨论的过程么....我都已经知道原因了,你不知道么??? ...

其实你也没认真看我的 我指的事情跟你的不是一回事
我是在MPLAB X环境下PICC18编译器 软件仿真 变量值一直不对
对了  你找到为什么值变大的原因了?
理应是截断变小才是 变大是说不通的才是

使用特权

评论回复
30
yewuyi| | 2013-11-26 09:07 | 只看该作者
yklstudent 发表于 2013-11-25 19:40
其实你也没认真看我的 我指的事情跟你的不是一回事
我是在MPLAB X环境下PICC18编译器 软件仿真 变量值一 ...

变大多数是因为有隐形的强制类型转换错误造成的。

还有一些是因为代码让编译器错误的理解为可以使用中间变量来优化减小代码量,因为中间变量的代入造成计算错误。

使用特权

评论回复
31
yewuyi| | 2013-11-26 09:14 | 只看该作者
越复杂的代码书写技巧,阅读和修改的难度越大,出错的几率越大,出错后纠错的难度越大。

所以,我一向要求下面的工程师尽量写那种让人一目了然的代码,任何复杂的代码行都必须给我拆解成最小单元,否则代码审查不让通过。

IAR有一份针对汽车电子产品代码编写的规范,那是极其严格的书写规范,想啥任何的书写花招都是不可能的。

使用特权

评论回复
32
Rain_King|  楼主 | 2013-11-26 13:35 | 只看该作者
yewuyi 发表于 2013-11-26 09:07
变大多数是因为有隐形的强制类型转换错误造成的。

还有一些是因为代码让编译器错误的理解为可以使用中间 ...

好吧,虽然总觉得有点牵强....但是,主要的目的达到了,这个以后注意点就OK了

使用特权

评论回复
33
Rain_King|  楼主 | 2013-11-26 13:38 | 只看该作者
yklstudent 发表于 2013-11-25 19:40
其实你也没认真看我的 我指的事情跟你的不是一回事
我是在MPLAB X环境下PICC18编译器 软件仿真 变量值一 ...

变大和变小,这不是主要解决的,主要解决的是为啥会出错....以及自己以后需要注意的东西,当然能够解释为啥变大也最好了,楼上有版主的一个解答,总感觉有点牵强....但是至少可以给你一个向这方面考虑的方向....

使用特权

评论回复
34
yklstudent| | 2013-11-26 17:27 | 只看该作者
Rain_King 发表于 2013-11-26 13:38
变大和变小,这不是主要解决的,主要解决的是为啥会出错....以及自己以后需要注意的东西,当然能够解释为 ...

变小好理解 变大就不好理解了
如果你只需要搞懂变小或者解决问题
不需要搞清楚变大 那也就无所谓了

使用特权

评论回复
35
秋雨| | 2013-11-29 11:41 | 只看该作者
view->disassembly listing
或者view->program memory

使用特权

评论回复
36
wy3383818| | 2014-5-14 14:33 | 只看该作者
刚在这个地方掉进坑里好久了,汗颜,用了PIC那么久居然现在才发现这个坑。
unsigned long int TEMP[6];
TEMP[1] = TMR1_Save_Ptr*1000*16/(SYS_CLOCK/1000);
死活TEMP[1]到了65536就上内不去。
后面才发现, TMR1_Save_Ptr定义为int的后,编译器编译时,计算结果是按int的形式强制进行转换计算的。
所以应该加上强制转换符
TEMP[1] = (unsigned long int)TMR1_Save_Ptr*1000*16/(SYS_CLOCK/1000);
数据计算类型要统一。

使用特权

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

本版积分规则