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

[复制链接]
3702|39
 楼主| 幸福至上 发表于 2016-5-12 15:17 | 显示全部楼层
along1980 发表于 2016-5-11 18:24
那本书上说的,,这样的隐式转换
http://blog.csdn.net/miaouu/article/details/5213042

谢谢。虽然例子里并没有移位运算符相关的资料,例子很有趣。相当于是进行运算时,是一步一步进行类型变换的,而不是一次性类型变换完再进行运算的?
 楼主| 幸福至上 发表于 2016-5-12 15:18 | 显示全部楼层
zyj9490 发表于 2016-5-11 18:41
左边跟右边没有关糸,TEMP1_U8

实际是移位运算前,会自动进行数据类型转换,所以2<<8 = 0x200,问题在于移位运算和加减运算的优先级上~
 楼主| 幸福至上 发表于 2016-5-12 15:20 | 显示全部楼层
datouyuan 发表于 2016-5-11 20:15
应该是7楼说得对.
我也碰到几次类似的疑难杂症,我是搞怕了.
以后只要看到这类表达式都会下意识增加括号, ...

嗯,应该养成这样一个“编程规范”。只是一直以为移位运算符的优先级比算术运算符高~
 楼主| 幸福至上 发表于 2016-5-12 15:21 | 显示全部楼层
nethopper 发表于 2016-5-11 20:25
你不信可以验证一下看,我刚在网上找了两个不同的网站验证查询运算符号的顺序问题,供参考,两个表格基本 ...

谢谢。此乃正解,确实第一个Test1函数计算出的temp_u16结果很奇葩,着实是运算优先级搞错。
 楼主| 幸福至上 发表于 2016-5-12 15:23 | 显示全部楼层
ticomi 发表于 2016-5-12 07:58
很基础的问题,非常不建议将这样的语句写成一句,分开写,即明白清晰,也不用死记优先级等。为何喜欢这样写 ...

这样写很快捷啥,Test2中的计算方式虽然正确,但也很繁琐。只是一直误以为了移位运算和算术运算的优先级。
 楼主| 幸福至上 发表于 2016-5-12 15:26 | 显示全部楼层
hgjinwei 发表于 2016-5-12 08:10
第一,temp_u16 = temp1_u8

赞同,最好的还是temp_u16 = ((u16)temp1_u8<<8) + temp2_u8这种方式,不加强制转换符,在跨编译器时,可能还会出错。Keil我一般都用默认优化级别,试来试去,编译代码变化太大了。
 楼主| 幸福至上 发表于 2016-5-12 15:27 | 显示全部楼层
mini1986 发表于 2016-5-12 08:32
不懂优先级,就使劲加括号就行了......

这样的话看起很新手~虽然耽搁了些时间,但就这个问题引出的收获也挺不错的。
ticomi 发表于 2016-5-12 15:58 | 显示全部楼层
幸福至上 发表于 2016-5-12 15:23
这样写很快捷啥,Test2中的计算方式虽然正确,但也很繁琐。只是一直误以为了移位运算和算术运算的优先级 ...

没什么作用,规规矩矩写就是最快捷的,少出一次问题节省的时间够写N多的代码了。
 楼主| 幸福至上 发表于 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.哪种说法比较靠谱呢?
 楼主| 幸福至上 发表于 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.哪种说法比较靠谱呢?
oayzw 发表于 2016-5-13 09:11 来自手机 | 显示全部楼层
考基础哈
datouyuan 发表于 2016-5-13 10:07 | 显示全部楼层
幸福至上 发表于 2016-5-12 17:41
对了,temp_u16 = (temp1_u8

从keil编译结果看,每个变量只提升1级,计算完后再提升到最高级。
xbd_119 发表于 2016-5-13 16:05 | 显示全部楼层
遇到优先级问题,加个括号,安全!
 楼主| 幸福至上 发表于 2016-5-16 11:29 | 显示全部楼层
datouyuan 发表于 2016-5-13 10:07
从keil编译结果看,每个变量只提升1级,计算完后再提升到最高级。

谢谢解答。或许我也应该自己用Keil来观察下汇编代码,只是不太会弄
zxqchongchi 发表于 2016-6-7 15:55 | 显示全部楼层
幸福至上 发表于 2016-5-12 14:33
你好。我看了下你的链接所贴出的笔记,大致理解是:移位操作前,会转换成范围大一些的有符号数进行运算, ...

你的问题我理解错了,正确答案是7楼的回复,‘+’的优先级高于‘>>’。
移位操作符对数据的类型转换规则在《C语言参考手册》中有详细描述。
Adu0227 发表于 2016-6-7 17:02 | 显示全部楼层
记那么多优先级,除了考试没一点用,这种情况可着劲的加括号就对了
oayzw 发表于 2016-6-8 08:20 来自手机 | 显示全部楼层
这二个函数没毛用,没优化掉是编译器留了点情面
 楼主| 幸福至上 发表于 2016-6-13 14:53 | 显示全部楼层
zxqchongchi 发表于 2016-6-7 15:55
你的问题我理解错了,正确答案是7楼的回复,‘+’的优先级高于‘>>’。
移位操作符对数据的类型转换规则 ...

谢谢。看了下这本书,对于用法讲得细致多了,就是卖的不太好找。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部