[STM32F1] 两个8位寄存器表示16位short型变量的转换方法

[复制链接]
 楼主| huangchui 发表于 2021-7-4 13:54 | 显示全部楼层 |阅读模式
寄存器是8位的寄存器,但是数据是16位的,要用两个寄存器分别表示高8位和低8位,数据手册上也写的是寄存器要用2进制补码,但是看到的官方里面的例程上的写法有点疑惑
 楼主| huangchui 发表于 2021-7-4 13:57 | 显示全部楼层
heweibig 发表于 2021-7-4 14:00 | 显示全部楼层

还有什么现象?能再详细描述下吗?
 楼主| huangchui 发表于 2021-7-4 14:06 | 显示全部楼层
他是先把高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位在或进来感觉是不是不一样啊?
chuxh 发表于 2021-7-4 14:08 | 显示全部楼层
先强转高8位,然后若再只是把低8位用加号加进来
 楼主| huangchui 发表于 2021-7-4 14:09 | 显示全部楼层
好像还符合逻辑一点
dingy 发表于 2021-7-4 14:11 | 显示全部楼层
其实最好的理解 方法是别参考人家的,自己在纸上先画画,然后编个小程序调试看看。
dengdc 发表于 2021-7-4 14:15 | 显示全部楼层
这里涉及到c语言的两个基本概念
jiahy 发表于 2021-7-4 14:16 | 显示全部楼层
类型转换和类型提升
spark周 发表于 2021-7-4 14:19 | 显示全部楼层
用Google搜cast和promotion能得到很多相关信息
 楼主| huangchui 发表于 2021-7-4 14:22 | 显示全部楼层
类型转换和类型提升这里大概略知一二,但是我上面的问题是我那个1,2这两种写法结果会一样吗?
 楼主| huangchui 发表于 2021-7-4 14:24 | 显示全部楼层
或者为什么导致的一样,或者不一样是什么导致的不一样。
zhenykun 发表于 2021-7-4 14:25 | 显示全部楼层
如果数据类型不提升,uint8_t类型变量左右8位后,变量步就是0了?????数据不就丢失了
 楼主| huangchui 发表于 2021-7-4 14:27 | 显示全部楼层
大家理解错我的意思了,确实我表述意思时候表述错了,没有注意到这个细节给大家带来的理解错误,或者我这么说大家能更好理解一点,1.((short)(fifo_data[ii+0] << 8)) | fifo_data[ii+1];
2. (short)((u16)(fifo_data[ii+0] << 8) | fifo_data[ii+1]);
chenjunt 发表于 2021-7-4 14:30 | 显示全部楼层
两个结果一样
左移的时候数据会自动提升成int的
 楼主| huangchui 发表于 2021-7-4 14:33 | 显示全部楼层
刚刚改了表达式,应该说是1和3表达的效果是一样的吗?在我的脑海中我理解是,两个8位表达补码16位,我应该先把2个8位的合成了一个16位的了,合成了16位的二进制之后我再去转换成short类型,但是我疑惑的官方的例子是它先把高8位转成一个16位的short之后,直接或了低8位,这样效果能一样吗?
 楼主| huangchui 发表于 2021-7-4 14:35 | 显示全部楼层
为什么一样,如果高8位转成了16位再转成short之后或低8位和加上低8位的效果一样,也就是我的1,3一样,那显然是没问题了,但是是一样的吗?
chenjunt 发表于 2021-7-4 14:42 | 显示全部楼层
官方不也是移了再或的么
chenho 发表于 2021-7-4 14:45 | 显示全部楼层
就你的应用场景而言,这种转换只要你移了再或就是对的
午夜粪车 发表于 2021-7-4 14:47 | 显示全部楼层
类型转换写不写,写在哪儿都无所谓
您需要登录后才可以回帖 登录 | 注册

本版积分规则

918

主题

12323

帖子

4

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