Строго говоря, PHP неправильный.
Полная битовая комбинация числа 2269495617392648
:
1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648)
Если сдвинуть вправо 24 раза, вы получите:
0000 0000 0000 0000 0000 0000 1000 0001 0000 0001 1000 0010 0000 (135272480)
Это битовая комбинация для 135272480
, а не 32
.
В PHP, очевидно, происходит то, что число 2269495617392648
усекается до 538447880
, сохраняя только младшие 32 бита. Обратите внимание, что число 2269495617392648
слишком велико, чтобы поместиться в 32-разрядное целое число со знаком или без знака.
Сдвиг вправо усеченных битов 24 раза дает нам 32
.
Before truncation to 32-bits:
1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648)
After truncation to 32-bits:
0010 0000 0001 1000 0001 0000 0000 1000 (538447880)
Right shifting the truncated bits by 24 bits:
0000 0000 0000 0000 0000 0000 0010 0000 (32)
Вы упомянули эту проблему, когда сказали:
Интересно то, что когда я
попытаться сдвинуть любое число больше, чем
int32 в .net дает плохие результаты ..
Это дает вам плохие результаты, потому что некоторые биты обрезаются, чтобы уместиться в 32 бита.
Если вы портируете с PHP на C # и хотите сохранить это поведение, вам нужно вручную обрезать биты, используя 2269495617392648 & 0xffffffff
вместо просто 2269495617392648
(см. ответ jcomeau_ictx ). Но имейте в виду, что в вашем PHP-коде существует проблема усечения битов. Я не уверен, намеренно это или нет.