给出意外值的 32 位整数
32 bit integer giving unexpected value
我有值 0xAA
,我想向左移动 24 位,得到 0xAA000000
。相反,我得到一个负值 (-0x56000000
)。
var value = 0xAA;
var shifted = value << 24; // -0x56000000
var expected = 0xAA000000; // 0xAA000000
(expected === shifted) // false
这发生在 Node.JS 和 Chrome 中。
它将值视为带符号的,因此最高位用作符号位。由于 0xAA000000 设置了最高位,因此您将得到一个负数。像大多数机器一样,它似乎代表 two's complement.
中的有符号值
在提供无符号值的语言中,这些类型的位操作通常首选无符号值,因为它们不受这些问题的影响。在 JavaScript 中,我通常会使用像 BigInteger.js 这样的库来处理正常有符号整数范围之外的整数值。 (从技术上讲,像典型的 JavaScript Number
值这样的浮点值应该能够表示您感兴趣的范围内的任何值,但这些并不是真正为按位类型设计的您尝试执行的操作,所以我认为使用库会更容易。
如果您肯定总是有一个 32 位值(并且不会更大)并且您想要一个无符号的结果,则使用零填充右移运算符 >>> 以零移位应该会给出正确的结果。
var value = 0xAA;
var shifted = (value << 24) >>> 0; // 0xAA000000
我有值 0xAA
,我想向左移动 24 位,得到 0xAA000000
。相反,我得到一个负值 (-0x56000000
)。
var value = 0xAA;
var shifted = value << 24; // -0x56000000
var expected = 0xAA000000; // 0xAA000000
(expected === shifted) // false
这发生在 Node.JS 和 Chrome 中。
它将值视为带符号的,因此最高位用作符号位。由于 0xAA000000 设置了最高位,因此您将得到一个负数。像大多数机器一样,它似乎代表 two's complement.
中的有符号值在提供无符号值的语言中,这些类型的位操作通常首选无符号值,因为它们不受这些问题的影响。在 JavaScript 中,我通常会使用像 BigInteger.js 这样的库来处理正常有符号整数范围之外的整数值。 (从技术上讲,像典型的 JavaScript Number
值这样的浮点值应该能够表示您感兴趣的范围内的任何值,但这些并不是真正为按位类型设计的您尝试执行的操作,所以我认为使用库会更容易。
如果您肯定总是有一个 32 位值(并且不会更大)并且您想要一个无符号的结果,则使用零填充右移运算符 >>> 以零移位应该会给出正确的结果。
var value = 0xAA;
var shifted = (value << 24) >>> 0; // 0xAA000000