verilog中,逻辑右移>>、算数右移>>>、以及无符号右移、有符号右移,仿真对比图(右移结果还跟被赋值的位数有关)
1、无符号逻辑右移>>,右移1位,等价于除以22、有符号逻辑右移>>仿真结果跟之前的无区别,但是,我把被赋值位数改变,就会有区别了(不知道为什么)3、将2中的c、d变成6bit看到不同了吧。此时b=10000,带符号右移移位,变成11000,即24,也就是-8,为何跟d的位数有关,就不太懂了。。。4、再来看一下,我认为的算数右移&...
1、无符号逻辑右移>>,右移1位,等价于除以2
2、有符号逻辑右移>>
仿真结果跟之前的无区别,但是,我把被赋值位数改变,就会有区别了(不知道为什么)
3、将2中的c、d变成6bit
看到不同了吧。此时b=10000,带符号右移移位,变成11000,即24,也就是-8,为何跟d的位数有关,就不太懂了。。。
4、再来看一下,我认为的算数右移>>>
与逻辑右移>>结果一样,之后,我又改变一下c、d的bit,结果也是一样。
5、带符号的算数右移和逻辑右移
看到了吧,cd与ab的bit是一样的,此时当b=10000时,d就为11000了。接下来,再看cd为6bit的情况
6、在5的基础上,把cd改成6bit
此时应该非常清楚了吧,b=10000时,d=11100。
我再换成signed Decimal显示,就一目了然了
总结如下:
1、如果对无符号数据进行移位,算数右移>>>和逻辑右移>>右移效果是等同的,就是把二进制数据向右移位,最高位补零;
2、如果想对有符号数据右移时(我觉着大部分人对有符号数据右移都是想进行除法运算吧),就直接使用>>>操作符。
(如有不对,还望指出)
补充:刚才试了一下,
我明白为何逻辑右移的结果与被赋值的位数有关了。。。运算过程是这样的,逻辑右移>>,第一步是把-16(10000)扩展成与被赋值位数相同的位数(用6位举例),因为a是带符号数据,所以扩展成110000,这时逻辑右移1位,即011000,即24。
算数右移不受位数影响,即相当于除法运算。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)