Javascript bug - 左位移返回错误的输出

时间:2013-12-17 12:32:17

标签: javascript bit-manipulation

案例如下:

/// returns 406913024, but should 417018740736
    alert(6363201 << 16); 

有什么问题?我在ruby中尝试了相同的操作,并返回正确的值(http://www.miniwebtool.com/bitwise-calculator/bit-shift/?data_type=10&number=6363201&place=16&operator=Shift+Left

2 个答案:

答案 0 :(得分:4)

引自MDN Left Shift Operator

  

该运算符将第一个操作数移位指定的位数   左边。向左移位的多余位被丢弃。零位   从右边移入。

引用Bitwise Shift Operators

  

移位运算符将其操作数转换为32位整数   big-endian顺序并返回与左边相同类型的结果   操作数。右操作数应小于32,但如果不是   将使用低五位。

6363201的二进制文件为11000010001100001000001

当您离开6363201 << 16时,它变为417018740736,二进制为110000100011000010000010000000000000000

现在,保留了最低有效位的32位,保留的实际位为00011000010000010000000000000000,对应406913024

答案 1 :(得分:2)

在JavaScript中,您正在处理32位数字。

6363201 << 16会产生110000100011000010000010000000000000000,其中 39 位。从第一个 7 位开始(因为你从右向左移动,你最终得到00011000010000010000000000000000,其中一个(二进制)parseInt会显示你是 406913024 ,而非417018740736。