[英]How do I use 32-bit signed integer's complement to represent an integer in javascript
示例:我将使用0xC0000000
(32 位有符号补码)作为-2^30
const num = Number('0xC0000000') console.log(num === -Math.pow(2,30)) // expected: true
JavaScript 在两个地方只有二进制补码整数:
作为某些操作期间的临时值。 按位运算符使用 32 位整数,一些Math
对象方法使用 32 位imul
数值(例如, imul
)。
作为Int16Array
、 Int32Array
或Int64Array
。 ( Int32Array
在你的情况下。)
否则,所有数字要么是number
(IEEE-754 双精度二进制浮点数)要么是BigInt
(任意精度非二进制补码整数)。
因此,例如,您可以在单元素Int32Array
中使用二进制补码。
const array = Int32Array.from([0xC000000]); console.log(array[0].toString(16));
但是,无论何时使用该 32 位整数,它都会转换为number
。 也就是说,JavaScript 在number
和 32 位有符号整数之间的转换相当聪明。 例如,考虑这个二进制补码边界条件:
const array = Int32Array.from([0x7FFFFFFF]); console.log(array[0].toString(16)); // 7fffffff ++array[0]; console.log(array[0].toString(16)); // -80000000
这就是您想要的二进制补码运算,即使它不是二进制补码运算(理论上;允许 JavaScript 引擎优化)。 操作是将 32 位二进制补码 int 转换为number
,递增number
,将number
转换回 32 位二进制补码 int。 但是我们还是得到了想要的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.