完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在调四轴飞控的时候看到了这行代码:
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位数据的代码,大概就是上面那么写的。 所以说那种写法到底有没有错?左移之后的数据会不会丢失? 求大神解答 |
|
相关推荐
31个回答
|
|
|
|
|
|
kpj3026 发表于 2019-1-30 13:06 如果在51单片机里,BUFF[0]左移8位后还等于16位吗? |
|
|
|
|
|
|
|
没问题的,buf[0]只是内存上的变量,要进行其它操作,比如移位,相加,相减等都是先要放到内核寄存器才能操作,内核寄存器都是32位的,不会有问题。这种方法不太好,用指针的方法会好很多 |
|
|
|
签到签到
|
|
|
|
恩恩,是的
|
|
|
|
涨姿势了
|
|
|
|
有问题
|
|
|
|
看了楼上大哥的汇编,知道这个结果的原因了。原因是r0 r1 寄存器是32位的,但是如果移植到16位机或8位机上,就不会是这个结果了。结论是写程序要规范,要先类型转换好了,再移位,否则的话,程序的移植性会很差。
|
|
|
|
应该是可以的吧,32位的计算能力,把8位数据装进去,然后还有24位其实是未知的,左移后,占用了未知的8位,赋值的时候只要是能装下都应该是可以的,你可以这样,拿两个不同大小的,uint16 和uint32来分别装结果,看看是否是有区别
|
|
|
|
多谢大家的答疑
|
|
|
|
我的理解是把左移后的数据赋值给了另外的变量了,移位后的数据并没有保存
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1015 浏览 1 评论
请问ad9910芯片的ram模式在接收数据时为什么会出现一段方波?
2396 浏览 1 评论
809 浏览 0 评论
不懂真得问!FREERTOS在中断里面,可以调用有任务级临界段代码的函数吗?
2324 浏览 1 评论
2205 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-7-4 05:49 , Processed in 0.605256 second(s), Total 62, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191