在调四轴飞控的时候看到了这行代码: 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位数据的代码,大概就是上面那么写的。 所以说那种写法到底有没有错?左移之后的数据会不会丢失? 求大神解答 |
orig[1]=2;
orig[2]=3;
orig[3]=4;
outInt16=(uint16_t)(orig[0]<<8)|orig[1];
outInt32=(uint32_t)(orig[0]<<24)|(uint32_t)(orig[1]<<16)|(uint32_t)(orig[2]<<8)|orig[3];
outInt16_1=(orig[0]<<8)|orig[1];
outInt32_1=(orig[0]<<24)|(orig[1]<<16)|(orig[2]<<8)|orig[3];
首先多谢老哥的调试图
outInt16=(uint16_t)(orig[0]<<8)|orig[1];
outInt16_1=(orig[0]<<8)|orig[1];
这两个运行结果一样,
为什么会这样呢????
难道左移8位之后数据没有丢失????
可是如果数组元素的存储地址是从低到高的话,那左移8位岂不是将orig[0]的数据移动到了orig[1]里给覆盖了?
你那样合并应该是有问题的 直接buf[0]就被清掉了 accData[0] = (uint16_t)buf[0] << 8 | buf[1] 这样应该就没有太大问题 先强制类型转换buf[0]到16位的 在移位 后面的可以不用强制转换 系统会自动向16位的靠
我也觉得有问题。。。
看到4楼那位大哥的调试图了吗?请问为什么会出现那种情况?
stm32的寄存器是32位的