请问合并两个8位数据的方式是否正确?

2019-07-14 14:18发布

在调四轴飞控的时候看到了这行代码:
uint8_t buf[6];
accData[0] = (int16_t)((buf[0] << 8) | buf[1]);//合并8位数据为16位

其中accData[0]是16位的,buf[0]、buf[1]是8位的。

如果先让8位的buf[0]先左移8位,会不会导致buf[0]的数据丢失?8位数组左移8位之后,数组原来的数据跑哪里去了?

我感觉合并数据应该这么合并:
1.将buf[0]的值赋给accData[0]的低8位;
2.accData[0]<<8;
3.将buf[0]的值赋给accData[0]的低8位;

在网上看了别人的C语言合并8位数据为16位数据的代码,大概就是上面那么写的。

所以说那种写法到底有没有错?左移之后的数据会不会丢失?

求大神解答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
chm1
1楼-- · 2019-07-14 22:59
求大神解答
60user135
2楼-- · 2019-07-15 03:12
本帖最后由 Tcreat 于 2017-5-23 19:44 编辑

你那样合并应该是有问题的  直接buf[0]就被清掉了     accData[0] = (uint16_t)buf[0] << 8 | buf[1]     这样应该就没有太大问题   先强制类型转换buf[0]到16位的 在移位  后面的可以不用强制转换   系统会自动向16位的靠  
chm1
3楼-- · 2019-07-15 05:57
60user135 发表于 2019-1-30 11:22
本帖最后由 Tcreat 于 2017-5-23 19:44 编辑

你那样合并应该是有问题的  直接buf[0]就被清掉了     accData[0] = (uint16_t)buf[0] &amp;lt;&amp;lt; 8 | buf[1]     这样应该就没有太大问题   先强制类型转换buf[0]到16位的 在移位  后面的可以不用强制转换   系统会自动向16位的靠   ...

我也觉得有问题。。。
chm1
4楼-- · 2019-07-15 08:46
youpukeji668 发表于 2019-1-30 11:01
    orig[0]=1;
    orig[1]=2;
    orig[2]=3;

本帖最后由 NNXia 于 2017-5-23 22:30 编辑


首先多谢老哥的调试图

outInt16=(uint16_t)(orig[0]<<8)|orig[1];
outInt16_1=(orig[0]<<8)|orig[1];
这两个运行结果一样,

为什么会这样呢????
难道左移8位之后数据没有丢失????

可是如果数组元素的存储地址是从低到高的话,那左移8位岂不是将orig[0]的数据移动到了orig[1]里给覆盖了?
chm1
5楼-- · 2019-07-15 13:36
 精彩回答 2  元偷偷看……
胡德胜快回答
6楼-- · 2019-07-15 14:14
我也试了试....

一周热门 更多>