右移运算符(>>)为何改变符号?Chrome下3332508426>>24得-58的疑问
问题解释
核心原因:JavaScript位运算基于32位有符号整数
JavaScript的所有位运算符(包括右移>>)都会先将操作数转换为32位有符号整数再执行运算,而非直接使用原始十进制数值。
1. 分析3332508426的32位有符号整数表示
32位有符号整数的取值范围是 -2^31(-2147483648)到 2^31-1(2147483647),3332508426远大于最大值,因此会被截断为32位二进制补码形式:
- 截断后的值为:
3332508426 - 2^32 = 3332508426 - 4294967296 = -962458870 - 其32位二进制的最高位(符号位)为
1,代表这是一个负数——这才是右移运算实际使用的操作数,完全符合MDN“右移结果符号与第一个操作数一致”的描述。
2. 执行右移24位运算的过程
右移>>运算符会保留符号位并进行符号扩展:
3332508426的32位二进制中,高8位对应IP地址的第一个段198,二进制为11000110- 右移24位后,高8位成为结果的全部位,由于符号位是
1,会扩展为32位负数补码 - 将
11000110作为8位有符号整数计算:- (2^8 - 198) = -58,最终得到结果-58
3. IP地址十进制表示的补充说明
3332508426是IP198.162.11.10的十进制形式,本质是198<<24 | 162<<16 | 11<<8 |10。如果想通过位运算正确提取IP段值,应使用无符号右移>>>,它会将操作数视为32位无符号整数,执行3332508426 >>> 24会得到预期的198。
内容的提问来源于stack exchange,提问作者Borneo777
相关产品推荐
相关产品推荐

