这种【合并两个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位数据的代码,大概就是上面那么写的。
所以说那种写法到底有没有错?左移之后的数据会不会丢失?
求大神解答 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;
求大神解答{:3_59:} 本帖最后由 Tcreat 于 2017-5-23 19:44 编辑
你那样合并应该是有问题的直接buf就被清掉了 accData = (uint16_t)buf << 8 | buf 这样应该就没有太大问题 先强制类型转换buf到16位的 在移位后面的可以不用强制转换 系统会自动向16位的靠 Tcreat 发表于 2017-5-23 19:42
你那样合并应该是有问题的直接buf就被清掉了 accData = (uint16_t)buf
我也觉得有问题。。。 本帖最后由 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里给覆盖了?
Tcreat 发表于 2017-5-23 19:42
你那样合并应该是有问题的直接buf就被清掉了 accData = (uint16_t)buf
看到4楼那位大哥的调试图了吗?请问为什么会出现那种情况? 我也试了试.... unsigned int NNXia 发表于 2017-5-23 22:24
首先多谢老哥的调试图
outInt16=(uint16_t)(orig
stm32的寄存器是32位的