你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
NNXia 提问时间:2017-5-23 18:32 /
阅读主题, 点击返回1楼
收藏 评论30 发布时间:2017-5-23 18:32
30个回答
JeffJiang 回答时间:2017-5-24 11:49:36
看看,帮顶
NNXia 回答时间:2017-5-24 13:16:44
斜阳__ 发表于 2017-5-24 08:12
stm32的寄存器是32位的

也就是说,8位数据左移只要不超过24位,数据就不会丢失?还在那个寄存器里?
NNXia 回答时间:2017-5-24 13:19:46
斜阳__ 发表于 2017-5-24 08:12
stm32的寄存器是32位的

8为数据左移之后时候否丢失是跟运行这行代码的机器有关的吧?
比如在51单片机中,8位数据左移8位之后就丢了?
斜阳 回答时间:2017-5-24 15:11:56
NNXia 发表于 2017-5-24 13:19
8为数据左移之后时候否丢失是跟运行这行代码的机器有关的吧?
比如在51单片机中,8位数据左移8位之后就丢 ...

51是8位单片机
NNXia 回答时间:2017-5-24 15:40:34

明白了,在32上运行这个代码是没问题的,但这行代码对数据来说是不安全的,移植到其他单片机上有可能不能用。
NNXia 回答时间:2017-5-24 15:40:55
す疯Ⅱ恒す 发表于 2017-5-24 10:41
看汇编代码吧,移位的数据并没有保存在原来的数组,保存在RO R1寄存器上,所以并没有任何问题。 ...

恩恩,是的
NNXia 回答时间:2017-5-24 15:41:41
hjl2832 发表于 2017-5-24 09:08
这样写有什么问题?BUFF[0]左移8位后等于16位,右边8位会自动补0,这时再与buff[1]相或,得到一个完整的16 ...

如果在51单片机里,BUFF[0]左移8位后还等于16位吗?
NNXia 回答时间:2017-5-24 15:42:11
潇潇雨歇pku 发表于 2017-5-24 09:06
这种还是以事实为准,写代码跑一遍是最简单的获取答案的途径

事实是对32单片机来说,数据不会丢失
蓝凌风 回答时间:2017-5-24 16:48:18
NNXia 发表于 2017-5-23 22:33
看到4楼那位大哥的调试图了吗?请问为什么会出现那种情况?

没问题的,buf[0]只是内存上的变量,要进行其它操作,比如移位,相加,相减等都是先要放到内核寄存器才能操作,内核寄存器都是32位的,不会有问题。这种方法不太好,用指针的方法会好很多
samhong 回答时间:2017-5-24 21:15:50
签到签到
NNXia 回答时间:2017-5-24 22:17:52
蓝凌风 发表于 2017-5-24 16:48
没问题的,buf[0]只是内存上的变量,要进行其它操作,比如移位,相加,相减等都是先要放到内核寄存器才能 ...

恩恩,是的
Tcreat 回答时间:2017-5-24 22:40:58
涨姿势了  
jcx0324 回答时间:2017-5-26 08:38:52
有问题              
zhao.zhao 回答时间:2017-5-26 09:33:55
看了楼上大哥的汇编,知道这个结果的原因了。原因是r0 r1 寄存器是32位的,但是如果移植到16位机或8位机上,就不会是这个结果了。结论是写程序要规范,要先类型转换好了,再移位,否则的话,程序的移植性会很差。
钊钊 回答时间:2017-5-26 09:42:10
应该是可以的吧,32位的计算能力,把8位数据装进去,然后还有24位其实是未知的,左移后,占用了未知的8位,赋值的时候只要是能装下都应该是可以的,你可以这样,拿两个不同大小的,uint16 和uint32来分别装结果,看看是否是有区别

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版