Разница в результатах побитовых операций между JavaScript и переполнением стека

Javascript код:

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

Вывод Javascript:

32
149209300

Код PHP:

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

Выход PHP:

32
4444176596

Зачем 1111044149 << 2 есть разница между PHP и JavaScript? Я пишу код JavaScript в PHP, и все работало меньше, чем эта часть, и мне нужно, чтобы код PHP показывал аналогичные результаты, полученные в JavaScript, чтобы быть идеальным.

1

Решение

Операнды побитовой операции в JavaScript всегда рассматриваются как int32, а в PHP это не так. Итак, при выполнении левого сдвига на 1111044149это происходит в JS:

01000010001110010011000000110101 (original, 32-bit)

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

А в PHP биты не усекаются, потому что это не рассматривается как 32-разрядное целое число.

3

Другие решения

Спасибо за объяснения, они мне очень помогли, и теперь я мог создать функцию для автоматического преобразования. Я забыл эту деталь о 32-разрядной и 64-разрядной версиях из-за отсутствия внимания.

функция

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

Тестовое задание

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

Выход

32
149209300
0

По вопросам рекламы [email protected]