NNXia 发表于 2017-5-23 18:32:50

这种【合并两个8位数据】的方式是否正确?

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

其中accData是16位的,buf、buf是8位的。

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

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

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

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

求大神解答

斜阳__ 发表于 2017-5-23 22:08:10

    orig=1;
    orig=2;
    orig=3;
    orig=4;
    outInt16=(uint16_t)(orig<<8)|orig;
    outInt32=(uint32_t)(orig<<24)|(uint32_t)(orig<<16)|(uint32_t)(orig<<8)|orig;
    outInt16_1=(orig<<8)|orig;
    outInt32_1=(orig<<24)|(orig<<16)|(orig<<8)|orig;






NNXia 发表于 2017-5-23 18:51:33

求大神解答{:3_59:}

Tcreat 发表于 2017-5-23 19:42:24

本帖最后由 Tcreat 于 2017-5-23 19:44 编辑

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

NNXia 发表于 2017-5-23 22:18:11

Tcreat 发表于 2017-5-23 19:42
你那样合并应该是有问题的直接buf就被清掉了   accData = (uint16_t)buf

我也觉得有问题。。。

NNXia 发表于 2017-5-23 22:24:15

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

斜阳__ 发表于 2017-5-23 22:08
orig=1;
    orig=2;
    orig=3;


首先多谢老哥的调试图

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

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

可是如果数组元素的存储地址是从低到高的话,那左移8位岂不是将orig的数据移动到了orig里给覆盖了?

NNXia 发表于 2017-5-23 22:33:39

Tcreat 发表于 2017-5-23 19:42
你那样合并应该是有问题的直接buf就被清掉了   accData = (uint16_t)buf

看到4楼那位大哥的调试图了吗?请问为什么会出现那种情况?

Mandelbrot_Set 发表于 2017-5-23 23:26:14

我也试了试....

Mandelbrot_Set 发表于 2017-5-23 23:29:09

unsigned int

斜阳__ 发表于 2017-5-24 08:12:11

NNXia 发表于 2017-5-23 22:24
首先多谢老哥的调试图

outInt16=(uint16_t)(orig

stm32的寄存器是32位的
页: [1] 2 3 4
查看完整版本: 这种【合并两个8位数据】的方式是否正确?