完善资料让更多小伙伴认识你,还能领取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来分别装结果,看看是否是有区别
|
|
|
|
|
|
多谢大家的答疑
|
|
|
|
|
|
我的理解是把左移后的数据赋值给了另外的变量了,移位后的数据并没有保存
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 10:52 , Processed in 0.875093 second(s), Total 63, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
11758