Основная проблема в том, что 1562143596806 слишком велик, чтобы поместиться в 32 бита. Он может быть представлен как Number
, но при выполнении побитовых операций значение сначала преобразуется в 32-разрядное целое число, и это означает, что «старшие биты» уже сброшены до сдвига - верхние биты следовательно, результат не заполняется из исходного значения, это копии знака этого временного 32-битного значения (или с >>>
, они будут равны нулю, что на самом деле не является улучшением). То, что результат получился отрицательным, является просто случайностью, зависящей от точной битовой комбинации входных данных, если бы она была положительной, это все равно было бы неправильным положительным значением.
Можно безопасно манипулировать такими большими значениями, как BigInt
, но поддержка для этого отсутствует. Использование арифметики с плавающей запятой может работать, но требует дополнительной осторожности. Например, вы можете разделить на 256 и получить результат в пол, но вы не можете использовать обычный |0
, чтобы избавиться от дробной части, потому что даже после деления на 256 значение слишком велико, чтобы поместиться в 32 бита. Существуют различные не встроенные библиотеки BigInt для решения подобных задач.