单片机学习心得1

        在实验时发现一个有趣的现象。如下图所示:

        现象1:将一个八位的数(0x11)左移八个位再赋值给一个十六位的变量,该八位的数据是能够保留的,并且向左边移动了八个位,变为0x1100。

        现象2:将这个八位的数(0x11)先左移八位(<<8)再右移八位(>>8),这个数并没变为0x00,而是保留了下了,没有变化,还是0x11。

        现象3:但是将这个八位的数左移八位后将它再赋值给原来的这个变量(rxd_buff[1]=rxd_buff[1]<<8;),再对这个变量进行右移八位时这个数据却回不去了,变成了0x00。

        现象4:将一个八位的数先右移八个位再左移八个位(rxd_buff[2]>>8)<<8)却不能还原数据,也变成0x00了。

        猜测可能得原因:移位运算应该是由移位寄存器实现的,而对八位的数据进行左移,之所以数据还能通过右移进行数据还原,是因为移位寄存器是大于8位的(应该是与系统内部芯片有关比如说32位或者64位),这样的话,当cpu取指令进行左移时,就会将8位的被移动数据(0x11)先移动到移位寄存器中,随后再执行左移操作,此时如果向左移动8位,那么被移动的数据就会处在移位寄存器的第16位到9位的位置上,而低八位会被补0(在移位寄存器中表现为0x1100),因此这八位数据并不会立刻消失。随后进行分类讨论:

        1)若此时紧接着再执行右移八位的操作(寄存器中的数据>>8,此时移位寄存器中的数据为0x11),将数据还原到低位了,自此数据被还原,也就是现象2的原因;

        2)若此时把移位寄存器的值再赋值给一个十六位的变量时,移位寄存器会从低位到高位依次将数据赋值给该变量,直到第16个位停止。此时原来八位的数据就在十六位变量的高八位上了,也不会消失,变量的值为0x1100,也就是现象1的原因;

        3)若此时将移位寄存器的值再赋值给一个八位的变量时,那么移位寄存器就会从低位到高位依次将数据赋值给改变量,直到第8个位停止。而通过上面可以知道移位寄存器的低八位都是0,所以被赋值的变量也就是0x00,而移位寄存器中剩余的数就会被清空以便下一条指令的执行,自此最开始的数据0x11被抛弃,也就是消失了。

        而对于右移来说,同样的道理,将八位的数据放入到移位寄存器的低八位后,因为是右移,所以数据就会直接被移出移位寄存器,进而导致数据马上就丢失了,哪怕你左移再多位无法找回你右移的一位数据。

        这只是我的一些想法,也不知道合不合理,若有大佬看到了,还望指点一二。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值