繁体   English   中英

我如何使用 32 位有符号整数的补码来表示 javascript 中的整数

[英]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 在两个地方只有二进制补码整数:

  1. 作为某些操作期间的临时值。 按位运算符使用 32 位整数,一些Math对象方法使用 32 位imul数值(例如, imul )。

  2. 作为Int16ArrayInt32ArrayInt64Array 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM