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

遇到的一个神奇的C编程问题

[复制链接]
楼主: 幸福至上
手机看帖
扫描二维码
随时随地手机跟帖
21
幸福至上|  楼主 | 2016-5-12 15:17 | 只看该作者 回帖奖励 |倒序浏览
along1980 发表于 2016-5-11 18:24
那本书上说的,,这样的隐式转换
http://blog.csdn.net/miaouu/article/details/5213042

谢谢。虽然例子里并没有移位运算符相关的资料,例子很有趣。相当于是进行运算时,是一步一步进行类型变换的,而不是一次性类型变换完再进行运算的?

使用特权

评论回复
22
幸福至上|  楼主 | 2016-5-12 15:18 | 只看该作者
zyj9490 发表于 2016-5-11 18:41
左边跟右边没有关糸,TEMP1_U8

实际是移位运算前,会自动进行数据类型转换,所以2<<8 = 0x200,问题在于移位运算和加减运算的优先级上~

使用特权

评论回复
23
幸福至上|  楼主 | 2016-5-12 15:20 | 只看该作者
datouyuan 发表于 2016-5-11 20:15
应该是7楼说得对.
我也碰到几次类似的疑难杂症,我是搞怕了.
以后只要看到这类表达式都会下意识增加括号, ...

嗯,应该养成这样一个“编程规范”。只是一直以为移位运算符的优先级比算术运算符高~

使用特权

评论回复
24
幸福至上|  楼主 | 2016-5-12 15:21 | 只看该作者
nethopper 发表于 2016-5-11 20:25
你不信可以验证一下看,我刚在网上找了两个不同的网站验证查询运算符号的顺序问题,供参考,两个表格基本 ...

谢谢。此乃正解,确实第一个Test1函数计算出的temp_u16结果很奇葩,着实是运算优先级搞错。

使用特权

评论回复
25
幸福至上|  楼主 | 2016-5-12 15:23 | 只看该作者
ticomi 发表于 2016-5-12 07:58
很基础的问题,非常不建议将这样的语句写成一句,分开写,即明白清晰,也不用死记优先级等。为何喜欢这样写 ...

这样写很快捷啥,Test2中的计算方式虽然正确,但也很繁琐。只是一直误以为了移位运算和算术运算的优先级。

使用特权

评论回复
26
幸福至上|  楼主 | 2016-5-12 15:26 | 只看该作者
hgjinwei 发表于 2016-5-12 08:10
第一,temp_u16 = temp1_u8

赞同,最好的还是temp_u16 = ((u16)temp1_u8<<8) + temp2_u8这种方式,不加强制转换符,在跨编译器时,可能还会出错。Keil我一般都用默认优化级别,试来试去,编译代码变化太大了。

使用特权

评论回复
27
幸福至上|  楼主 | 2016-5-12 15:27 | 只看该作者
mini1986 发表于 2016-5-12 08:32
不懂优先级,就使劲加括号就行了......

这样的话看起很新手~虽然耽搁了些时间,但就这个问题引出的收获也挺不错的。

使用特权

评论回复
28
ticomi| | 2016-5-12 15:58 | 只看该作者
幸福至上 发表于 2016-5-12 15:23
这样写很快捷啥,Test2中的计算方式虽然正确,但也很繁琐。只是一直误以为了移位运算和算术运算的优先级 ...

没什么作用,规规矩矩写就是最快捷的,少出一次问题节省的时间够写N多的代码了。

使用特权

评论回复
29
幸福至上|  楼主 | 2016-5-12 17:14 | 只看该作者
hgjinwei 发表于 2016-5-12 08:10
第一,temp_u16 = temp1_u8

对了,temp_u16 = (temp1_u8<<8) + temp2_u8,这儿的数据类型转换是怎么回事呢?看网友有两种说法:一种说法是,开始运算前,先将计算式里的所有的数据类型统一转换为最高级,在此例中,即先全部转换为u16,然后再开始计算;另一种说法是,计算式边展开计算边转换数据类型,所以,左移运算时,先转换temp1_u8为int型再运算,再将temp2_u8转换为int型进行算术运算,最后把结果转换为u16赋值给temp_u16.哪种说法比较靠谱呢?

使用特权

评论回复
30
幸福至上|  楼主 | 2016-5-12 17:41 | 只看该作者
nethopper 发表于 2016-5-11 20:25
你不信可以验证一下看,我刚在网上找了两个不同的网站验证查询运算符号的顺序问题,供参考,两个表格基本 ...

对了,temp_u16 = (temp1_u8<<8) + temp2_u8,这儿的数据类型转换是怎么回事呢?看网友有两种说法:一种说法是,开始运算前,先将计算式里的所有的数据类型统一转换为最高级,在此例中,即先全部转换为u16,然后再开始计算;另一种说法是,计算式边展开计算边转换数据类型,所以,左移运算时,先转换temp1_u8为int型再运算,再将temp2_u8转换为int型进行算术运算,最后把结果转换为u16赋值给temp_u16.哪种说法比较靠谱呢?

使用特权

评论回复
31
oayzw| | 2016-5-13 09:11 | 只看该作者
考基础哈

使用特权

评论回复
32
datouyuan| | 2016-5-13 10:07 | 只看该作者
幸福至上 发表于 2016-5-12 17:41
对了,temp_u16 = (temp1_u8

从keil编译结果看,每个变量只提升1级,计算完后再提升到最高级。

使用特权

评论回复
33
xbd_119| | 2016-5-13 16:05 | 只看该作者
遇到优先级问题,加个括号,安全!

使用特权

评论回复
34
幸福至上|  楼主 | 2016-5-16 11:29 | 只看该作者
datouyuan 发表于 2016-5-13 10:07
从keil编译结果看,每个变量只提升1级,计算完后再提升到最高级。

谢谢解答。或许我也应该自己用Keil来观察下汇编代码,只是不太会弄

使用特权

评论回复
35
zxqchongchi| | 2016-6-7 15:55 | 只看该作者
幸福至上 发表于 2016-5-12 14:33
你好。我看了下你的链接所贴出的笔记,大致理解是:移位操作前,会转换成范围大一些的有符号数进行运算, ...

你的问题我理解错了,正确答案是7楼的回复,‘+’的优先级高于‘>>’。
移位操作符对数据的类型转换规则在《C语言参考手册》中有详细描述。

使用特权

评论回复
36
Adu0227| | 2016-6-7 17:02 | 只看该作者
记那么多优先级,除了考试没一点用,这种情况可着劲的加括号就对了

使用特权

评论回复
37
oayzw| | 2016-6-8 08:20 | 只看该作者
这二个函数没毛用,没优化掉是编译器留了点情面

使用特权

评论回复
38
幸福至上|  楼主 | 2016-6-13 14:53 | 只看该作者
zxqchongchi 发表于 2016-6-7 15:55
你的问题我理解错了,正确答案是7楼的回复,‘+’的优先级高于‘>>’。
移位操作符对数据的类型转换规则 ...

谢谢。看了下这本书,对于用法讲得细致多了,就是卖的不太好找。

使用特权

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

本版积分规则