打印
[STM32F1]

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

[复制链接]
1540|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
寄存器是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位在或进来感觉是不是不一样啊?

使用特权

评论回复
5
chuxh| | 2021-7-4 14:08 | 只看该作者
先强转高8位,然后若再只是把低8位用加号加进来

使用特权

评论回复
6
huangchui|  楼主 | 2021-7-4 14:09 | 只看该作者
好像还符合逻辑一点

使用特权

评论回复
7
dingy| | 2021-7-4 14:11 | 只看该作者
其实最好的理解 方法是别参考人家的,自己在纸上先画画,然后编个小程序调试看看。

使用特权

评论回复
8
dengdc| | 2021-7-4 14:15 | 只看该作者
这里涉及到c语言的两个基本概念

使用特权

评论回复
9
jiahy| | 2021-7-4 14:16 | 只看该作者
类型转换和类型提升

使用特权

评论回复
10
spark周| | 2021-7-4 14:19 | 只看该作者
用Google搜cast和promotion能得到很多相关信息

使用特权

评论回复
11
huangchui|  楼主 | 2021-7-4 14:22 | 只看该作者
类型转换和类型提升这里大概略知一二,但是我上面的问题是我那个1,2这两种写法结果会一样吗?

使用特权

评论回复
12
huangchui|  楼主 | 2021-7-4 14:24 | 只看该作者
或者为什么导致的一样,或者不一样是什么导致的不一样。

使用特权

评论回复
13
zhenykun| | 2021-7-4 14:25 | 只看该作者
如果数据类型不提升,uint8_t类型变量左右8位后,变量步就是0了?????数据不就丢失了

使用特权

评论回复
14
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]);

使用特权

评论回复
15
chenjunt| | 2021-7-4 14:30 | 只看该作者
两个结果一样
左移的时候数据会自动提升成int的

使用特权

评论回复
16
huangchui|  楼主 | 2021-7-4 14:33 | 只看该作者
刚刚改了表达式,应该说是1和3表达的效果是一样的吗?在我的脑海中我理解是,两个8位表达补码16位,我应该先把2个8位的合成了一个16位的了,合成了16位的二进制之后我再去转换成short类型,但是我疑惑的官方的例子是它先把高8位转成一个16位的short之后,直接或了低8位,这样效果能一样吗?

使用特权

评论回复
17
huangchui|  楼主 | 2021-7-4 14:35 | 只看该作者
为什么一样,如果高8位转成了16位再转成short之后或低8位和加上低8位的效果一样,也就是我的1,3一样,那显然是没问题了,但是是一样的吗?

使用特权

评论回复
18
chenjunt| | 2021-7-4 14:42 | 只看该作者
官方不也是移了再或的么

使用特权

评论回复
19
chenho| | 2021-7-4 14:45 | 只看该作者
就你的应用场景而言,这种转换只要你移了再或就是对的

使用特权

评论回复
20
午夜粪车| | 2021-7-4 14:47 | 只看该作者
类型转换写不写,写在哪儿都无所谓

使用特权

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

本版积分规则

918

主题

12323

帖子

4

粉丝