简体   繁体   中英

Difference in the results of operations bitwise between javascript and php

Javascript code:

console.log( 1 << 5 );
console.log( 1111044149 << 2 );

Javascript output:

32
149209300

PHP code:

var_dump( 1 << 5 );
var_dump( 1111044149 << 2 );

PHP output:

32
4444176596

Why 1111044149 << 2 has difference between PHP and javascript? I'm writing a javascript code to PHP and everything worked less that part and I need the PHP code shows similar results obtained in javascript to be perfect.

The operands of a bitwise operation in JavaScript are always treated as int32, and in PHP this is not the case. So, when performing the left shift on 1111044149 , this happens in JS:

01000010001110010011000000110101 (original, 32-bit)

00001000111001001100000011010100 (left shifted 2 positions, "01" is truncated)
= 149209300

And in PHP, the bits do not get truncated because it is not treated as a 32-bit integer.

Thanks for the explanations, helped me a lot and I could now make a function to handle this automatically conversion, I had forgotten that detail about 32-bit and 64-bit for lack of attention.

Function

function shift_left_32( $a, $b ) {
    return ( $c = $a << $b ) && $c >= 4294967296 ? $c - 4294967296 : $c;
}

Test

var_dump( shift_left_32( 1, 5 ) );
var_dump( shift_left_32( 1111044149, 2 ) );

Output

32
149209300

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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