Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

JavaScript can handle the following Math just fine:

var result = (20000000 * 48271) % 0x7FFFFFFF;

But in some programming languages, that first int*int multiplication results in a value too large to hold in a standard 32 bit integer. Is there any way to "simulate" this in JavaScript, and see what the resulting calculation would be if the multiplication resulted in an integer overflow?

share|improve this question
1  
    
@FélixSaparelli It's not a duplicate, 20000000 * 48271 is still well within the JavaScript Number's 52 bit accuracy; it will not overflow. I'm trying to simulate a 32 bit overflow. –  IQAndreas May 10 at 6:33
    
I cheated by subtracting 2^32 enough times from the result, but I don't think that's very efficient or very smart :P –  BoltClock May 10 at 6:34
    
if Math.abs(int * int) is greater than (2^32)/2 then log value and continue? –  Xotic750 May 10 at 6:45
add comment

2 Answers 2

up vote 1 down vote accepted

It is possible to simulate 32-bit integer by "abusing" the bitwise operators available in JavaScript (since they can only return integers within that range).

To convert to a signed 32-bit integer:

x = (a * b) | 0;

To convert to an unsigned 32-bit integer:

x = (a * b) >>> 0;
share|improve this answer
    
The source of the code is from an different question: StackOverflow: JavaScript Integer math incorrect results –  IQAndreas May 27 at 1:26
add comment

In newer browsers, Math.imul(a,b) will give you an actual 32-bit integer multiplied result, with overflow resulting the way you would expect (it gives the lower half of the 64-bit result as what it returns).

However, as far as I know there's no way to actually get the overflow, (the upper 32 bits) but the modulus you showed in your answer gets rid of that information, so I figure that's not what you want. If they were going to do overflow, they'd have to separate it based on signed and unsigned anyway.

I know this works in Chrome, Firefox, and Opera, not sure about the rest, though pretty sure IE doesn't have it (typical). You'd need to fall back to a shim such as this one.

share|improve this answer
    
I think you're confusing 32-bit/64-bit with unsigned/signed. –  BoltClock May 10 at 16:53
    
No, when you multiply two 32 bit numbers in two's complement, it produces a 64 bit result, though the lower half will be correct regardless of whether the multiplication is signed or not- it's the upper half, the overflow, that varies based on signedness. See stackoverflow.com/questions/14063599/… –  TND May 10 at 21:07
    
Ah OK, thanks for the correction. –  BoltClock May 11 at 6:34
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.