zzg 发表于 2008-7-16 15:34

ADS编译器遇到的怪事

非常简单的语句,其中checksum&nbsp;uint8的<br /><br />这样写没的问题,<br />&nbsp;&nbsp;&nbsp;&nbsp;checksum&nbsp;=&nbsp;~checksum;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(checksum&nbsp;!=&nbsp;buf)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br /><br /><br />改成这样每次都执行到return&nbsp;0;&nbsp;<br />&nbsp;&nbsp;&nbsp;if(~checksum&nbsp;!=&nbsp;buf)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br /><br />

dld2 发表于 2008-7-17 08:22

呵呵

说明第一种写法是安全写法。<br /><br />长运算表达式的中间结果有时会发生类型改变。

zzg 发表于 2008-7-17 10:06

这编译器不会那么傻嘛,checksum的类型是明确的

ccf_2006 发表于 2008-7-17 17:24

不懂

kunliu 发表于 2008-7-17 17:54

应该是流水线冲突吧

<br /><br />究竟是不是我就不知道了(要看反汇编),大概是的,理由如下:<br /><br />&nbsp;&nbsp;&nbsp;~checksum&nbsp;!=&nbsp;buf&nbsp;<br /><br />arm、dsp等高速器件采用多级流水线结构<br /><br />~chedksum的值还没有算出即开始比较了,这样当然不行了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />

dld2 发表于 2008-7-17 19:54

同意楼上一半:要看反汇编

但不应该是流水线冲突。这个C编译器肯定要解决的。

hotpower 发表于 2008-7-17 20:07

if((~checksum) != buf[13]) return 0;

不放心的就()~~~~~~~~~~~~~

pheavecn 发表于 2008-7-18 10:43

哈哈,不放心的就()~~~~~~~~~~~~~

我现在()才放心。<br />懒得记优先级。<br />(a*b)+c,嘻嘻,够变态吧。。。

bigfacecat 发表于 2008-8-22 17:07

挺玄

挺玄

dragon_hn 发表于 2008-8-23 07:25

ADS编译器本身就有问题.

十六进制数中不能出现E,因为编译器把E当成指数.

dld2 发表于 2008-8-23 11:10

楼上说的不是真的吧

边缘地带 发表于 2008-8-26 13:03

有这回事,那变量岂不是不能用e?

dragon_hn 发表于 2008-8-26 13:51

严格的说,是不能E+....

例如<br />int&nbsp;test(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a=10;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;b=0x1E+a;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;出错,因为编译器把&quot;E+&quot;当成指数.<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;b;<br />}<br /><br /><br />跳过的写法是:<br /><br />int&nbsp;test(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a=10;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;b=0x1D+1+a;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;正确<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;b;<br />}<br />
页: [1]
查看完整版本: ADS编译器遇到的怪事