打印
[STM32F1]

关于两个8位寄存器表示16位short型变量的转换方法的疑问?

[复制链接]
2852|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
摩天轮1111|  楼主 | 2016-2-28 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 摩天轮1111 于 2016-2-29 15:02 编辑

如标题所示,有点疑问,这里接触到一个芯片,寄存器是8位的寄存器,但是数据是16位的,要用两个寄存器分别表示高8位和低8位,数据手册上也写的是寄存器要用2进制补码,但是看到的官方里面的例程上的写法有点疑惑,
file:///C:\Users\袁玉斌\AppData\Roaming\Tencent\Users\792286050\QQ\WinTemp\RichOle\`_4SIYQ8F5B(Z~)E9WH5S6S.png

如上所示,他是先把高8位寄存器转成16位的数之后强制转换成了short,然后再把低8位补进去,但是我感觉为什么不是先把高8位和低8位合成16位的数了之后,再强制转换成为short类型的,就是如下,为什么是1这种写法,不是2这种写法。
1.((short)(fifo_data[ii+0] << 8)) | fifo_data[ii+1];
2. (short)((u16)(fifo_data[ii+0] << 8) | fifo_data[ii+1]);
3. (short)(fifo_data[ii+0] << 8) + fifo_data[ii+1] ;

这里很费解,感觉1,2这样的做法得到的结果应该是不一样的啊,因为16位补码表示的数在算的时候,是最高位第15位若为1就是(-8000+u16[0:14]),若为0就是u16[0:14]了,但是若是先处理高8位强转了,后面低8位在或进来感觉是不是不一样啊?它先强转高8位,然后若再只是把低8位用加号加进来我感觉那好像还符合逻辑一点,小弟这里理解不到位,请大神解惑
这里问题我写的时候没注意,大家都理解到了那个移位移出去的那个上面去了,我的失误,不好意思,我改了一下2的表达式,我是想表达的是这个意思,或者说1和3表达的意思是一样的吗?



沙发
wahahaheihei| | 2016-2-28 20:49 | 只看该作者
其实最好的理解 方法是别参考人家的,自己在纸上先画画,然后编个小程序调试看看。

使用特权

评论回复
板凳
lxyppc| | 2016-2-28 21:40 | 只看该作者
这里涉及到c语言的两个基本概念
类型转换和类型提升
用Google搜cast和promotion能得到很多相关信息

使用特权

评论回复
地板
yklstudent| | 2016-2-29 14:37 | 只看该作者
如果数据类型不提升,uint8_t类型变量左右8位后,变量步就是0了?????数据不就丢失了

使用特权

评论回复
5
摩天轮1111|  楼主 | 2016-2-29 14:59 | 只看该作者
yklstudent 发表于 2016-2-29 14:37
如果数据类型不提升,uint8_t类型变量左右8位后,变量步就是0了?????数据不就丢失了 ...

我这里罪过了,我想大家理解错我的意思了,确实我表述意思时候表述错了,没有注意到这个细节给大家带来的理解错误,或者我这么说大家能更好理解一点,1.((short)(fifo_data[ii+0] << 8)) | fifo_data[ii+1];
2. (short)((u16)(fifo_data[ii+0] << 8) | fifo_data[ii+1]);

使用特权

评论回复
6
摩天轮1111|  楼主 | 2016-2-29 15:05 | 只看该作者
本帖最后由 摩天轮1111 于 2016-2-29 15:08 编辑
lxyppc 发表于 2016-2-29 15:00
两个结果一样
左移的时候数据会自动提升成int的

大神这里可能理解错了我的疑问,我也确实没有说清楚,刚刚改了表达式,应该说是1和3表达的效果是一样的吗?在我的脑海中我理解是,两个8位表达补码16位,我应该先把2个8位的合成了一个16位的了,合成了16位的二进制之后我再去转换成short类型,但是我疑惑的官方的例子是它先把高8位转成一个16位的short之后,直接或了低8位,这样效果能一样吗?为什么一样,如果高8位转成了16位再转成short之后或低8位和加上低8位的效果一样,也就是我的1,3一样,那显然是没问题了,但是是一样的吗?

使用特权

评论回复
7
lxyppc| | 2016-2-29 15:14 | 只看该作者
摩天轮1111 发表于 2016-2-29 15:05
大神这里可能理解错了我的疑问,我也确实没有说清楚,刚刚改了表达式,应该说是1和3表达的效果是一样的吗 ...


官方不也是移了再或的么
就你的应用场景而言,这种转换只要你移了再或就是对的
类型转换写不写,写在哪儿都无所谓

因为你的short型比自动提升出来的int类型信息量少
整个表达式都是按照int来运作的,不会丢信息

使用特权

评论回复
8
pkoko| | 2019-7-28 20:10 | 只看该作者
合并再short,还是先short再加,无论哪种,由于低8位对结果都没影响啊

使用特权

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

本版积分规则

38

主题

224

帖子

15

粉丝