javascript - 32 位整数给出意想不到的值

标签 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 中都会出现这种情况。

最佳答案

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

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

如果您确实始终有一个 32 位值(且不大于)并且想要一个无符号结果,则使用零填充右移运算符 >>> 进行零移位应该会给出正确的结果。

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

关于javascript - 32 位整数给出意想不到的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710424/

相关文章:

c++ - 在 std::uint8_t 中移位

android - 试图理解 Bitmap.Config.ARBG_8888

c++ - 逻辑运算符与按位运算符的区别是什么

javascript - 如果用户出现 "cancels"提示框则

javascript - 通过 Meetup API 获取超过 200 名群组成员

javascript - 如何将 jquery ui 对话框定位在具有多个 iframe 的屏幕中心..?

c - 有没有办法用按位检查 char * 是否为空

Javascript - 解析十六进制值

javascript - ~ 和 - Javascript 运算符问题

javascript - 无法通过javascript加载html文件