32位整数给出意外值

时间:2017-04-30 19:25:04

标签: javascript bit-manipulation bitwise-operators

我有值0xAA我想要向左移24位,给我0xAA000000。相反,我得到一个负值(-0x56000000)。

var value = 0xAA;
var shifted = value << 24; // -0x56000000
var expected = 0xAA000000; // 0xAA000000

(expected === shifted) // false

这在Node.JS和Chrome中都会发生。

1 个答案:

答案 0 :(得分:3)

它将值视为有符号,因此最高位用作符号位。由于0xAA000000设置了最高位,因此您将使用负数进行清理。与大多数机器一样,它似乎代表two's complement中的带符号值。

在提供它们的语言中,无符号值通常是这类比特操作的首选,因为它们不受这些问题的影响。在JavaScript中,我通常使用像BigInteger.js这样的库来处理正常有符号整数范围之外的整数值。 (从技术上讲,像典型的JavaScript Number值这样的浮点值应该能够表示您感兴趣的范围内的任何值,但这些值并非真正针对各种按位设计您尝试执行的操作,因此我认为库将更容易使用)。

如果您肯定总是拥有32位值(并且没有更大)并且您想要无符号结果,则使用零填充右移运算符&gt;&gt;&gt;转移零应该给出正确的结果。

var value = 0xAA; var shifted = (value << 24) >>> 0; // 0xAA000000