Ну, самый простой способ сделать это - просто добавить максимальное значение к вашему номеру.Это означает, что на длинном номере платформы x86 добавьте 2 ^ 32:
if($size < 0) $size = pow(2,32) + $size;
пример: Big_File.exe - 3,30 ГБ (3.554.287.616 б) ваша функция возвращает -740679680, поэтому вы добавляете 2 ^ 32 (4294967296)и получите 3554287616.
Вы получаете отрицательное число, потому что ваша система резервирует один бит памяти для отрицательного знака, так что у вас остается 2 ^ 31 (2.147.483.648 = 2G) максимальное значение отрицательного или положительного числа,Когда система достигает этого максимального значения, она не останавливается, а просто перезаписывает последний зарезервированный бит, и теперь ваш номер становится отрицательным.Проще говоря, когда вы превысите максимальное положительное число, вы будете вынуждены максимально отрицательное число, поэтому 2147483648 + 1 = -2147483648.Дальнейшее сложение идет к нулю, а затем к максимальному числу.
Как вы можете видеть, это похоже на круг с наибольшими и наименьшими числами, замыкающими цикл.
Общее максимальное число, которое архитектура x86 может переварить"в одном тике 2 ^ 32 = 4294967296 = 4G, поэтому, пока ваше число меньше этого, этот простой трюк всегда будет работать.При больших числах вы должны знать, сколько раз вы прошли точку цикла, просто умножить ее на 2 ^ 32 и добавить к вашему результату:
$size = pow(2,32) * $loops_count + $size;
Конечно, в основных функциях PHP это довольно сложно сделатьпотому что ни одна функция не скажет вам, сколько раз она прошла точку зацикливания, поэтому это не будет работать для файлов более 4Gigs.