javascript中符号传播右移和零填充右移的区别?

javascript中符号传播右移和零填充右移的区别?,javascript,Javascript,据我所知 符号传播右移(a>>b):将二进制表示中的a位右移,丢弃移位的位 例:8>>2将返回2。因为二进制1000将右移2次并返回0010 零填充右移(a>>>b):将二进制表示法中的a位右移,丢弃移开的位,并从左移入零 例:8>>2返回2。它也返回相同的值 那么>和>运算符之间的区别是什么?为什么javascript使用这两个运算符而不是一个,或者如果我错了,请指导我获得正确的概念?按位运算符假定其操作数是32位有符号整数 以2为基数的0000000000000000000000 1000等

据我所知

符号传播右移(a>>b):将二进制表示中的a位右移,丢弃移位的位

例:8>>2将返回2。因为二进制1000将右移2次并返回0010

零填充右移(a>>>b):将二进制表示法中的a位右移,丢弃移开的位,并从左移入零

例:8>>2返回2。它也返回相同的值


那么
>
>
运算符之间的区别是什么?为什么javascript使用这两个运算符而不是一个,或者如果我错了,请指导我获得正确的概念?

按位运算符假定其操作数是32位有符号整数

以2为基数的
0000000000000000000000 1000
等于以10为基数的
8

8>>2
中,符号传播向右移位运算符(>>)将二进制数移位两位,保留符号(第一位):

以2为基数的
00000000000000000010
等于以10为基数的
2

8>>>2
中,零填充右移位运算符(>>>)将二进制数移位两位,在左位填充0:

以2为基数的
00000000000000000010
等于以10为基数的
2

它们是相同的,只是因为正二进制数的第一位是零

对于非负数,零填充右移和符号传播 右移也会产生同样的结果


然而,对于负数,情况看起来有所不同:

11111111111111 000
在基数2中等于
-8
在基数10中

-8>>2
中,符号传播向右移位运算符(>>)将二进制数移位两位,保留符号:

基2中的
1111111111111111111 0
等于基10中的
-2

-8>>>2
中,零填充右移位运算符(>>>)将二进制数移位两位,用0填充左位:


00111111111111111111110
在基数2中等于
1073741822

试试
-8>>2
:-2 vs.
-8>>2
:1073741822能给你正确的答案你能举个例子说明每一个都用负数吗?为什么要用>>而不是>>,反之亦然?有人能解释一下吗为什么会发生这种情况<代码>数字.MAX_SAFE_INTEGER是
9007199254740991
Number.MAX_SAFE_INTEGER.toString(2)
“11111111111111111111111111”
所以
数字.MAX_SAFE_INTEGER>>1
-1