>> 与 >>>

2019-06-23  本文已影响0人  Poisson_Lee

>> 是逻辑右移

>>> 是算术右移

逻辑右移和左移, 空位都是补0, 右移,空的高位补0, 左移,空的低位补0。可以认为输入都看作无符号数。

算术右移,高位补符号位,左移,低位补0。
但有一点要注意,高位补的是符号位。

所以如果一个32bit数 32‘hA0A0_FAFA;
如果把这个数值赋给一个int型变量, 符号位为1, 那么算术右移,高位是补1的;
如果这个数值是赋给了一个bit【31:0】变量,这是一个无符号数,尽管最高位是1,但bit【31:0】的变量永远是一个非负数,认为符号位是0。所以,即使是>>>算术右移,高位仍然是补0的。

逻辑右移和左移的 第二个操作数,不要是负数,不然结果会是0.

算术左移的第二个操作数,如果是负数,结果是0.
算术右移的第二个操作数,如果是负数,如果第一个操作数是int型,有符号数,结果不是0.
int a=‘hA0A0_FAFA
a = (a >>> -4)
结果是{28'hfff_ffff, 4'hA}, 4‘hA是高位的4bit A。
int a=‘h0A0A_FAFA
a = (a >>> -8)
结果是{24'h0, 8'h0A}, 8‘h0A是高位的8bit 0A。

不管怎么样,保证第二个操作数不要为负数,就不会出现意想不到的结果。同时记得第一个操作数的类型和符号位。

上一篇下一篇

猜你喜欢

热点阅读