8

我正在将一些旧版 Pascal 转换为 JavaScript。我需要多个两个 32 位有符号整数。

在下面的示例循环中,一些乘法会导致溢出并给出负数。这是故意的。我需要在与旧系统匹配的末尾重现相同的最终数字 x。

如何在 JavaScript 中执行此操作以达到相同的结果?

这是一些示例代码:

var x = new Number(some value);  // I need this to be a 32-bit signed integer
var y = new Number(some value); // I need this to be a 32-bit signed integer

for (var i=0; i<100; i++) {   
    x = x * y; 
} 
return x;
4

2 回答 2

10

Javascript 的位运算符实际上将值转换为常规整数。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators这个事实被 asm.js 之类的东西用来强制类型,你也可以自己做。诀窍是在数字末尾放置 |0 以强制它为 32 位

function test() {
    var x = 255|0; // |0 does the type coercion
    var y = 255|0; // not strictly necessary at this var decl but used for explicitness

    for (var i=0; i<5; i++) {   
         x = (y * x)|0; // parens needed because |'s precedence
   } 

   return x;
}

我用几个数字运行它并得到与 Firefox 中的 C 相同的结果.. 没有机会在 IE 中进行测试,但我很确定这种行为在 ECMAscript 规范中,所以它应该可以工作。

于 2013-11-07T18:37:42.523 回答
1

JavaScript 中的数学运算总是作为双精度浮点数来完成的。您必须编写自己的乘法例程(或在某处找到一个)来执行整数数学,这会很慢或很难(或两者兼而有之:)。

于 2013-11-07T18:25:11.953 回答