作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有值 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/
我是一名优秀的程序员,十分优秀!