Меня только что укусила функция *1002* для платформы , возвращающая отрицательное число для файла> 2 ГБ.
Является ли это поведение "платформо-зависимым" или "неопределенным"?
ФОН
PHP написан на C. В C целочисленные переполнения без знака имеют определенное поведение, а целочисленные переполнения со знаком - нет. Целочисленные переполнения со знаком вызывают «неопределенное поведение», из-за чего абстрактная машина выполнения остается в неопределенном состоянии .
Я полагаю, что на практике большинство аппаратных средств хранят целые числа со знаком с использованием дополнения до двух, а переполнение со знаком целого числа просто "оборачивает" вокруг себя, создавая поведение, которого ожидает большинство людей. Например, -2147483649 - 1 == 0
.
Теоретически, любая C-программа (включая механизм PHP), в которой целочисленные переполнения со знаком находятся в неопределенном состоянии, в котором простая операция, такая как int x = 1
, может работать точно так же, как ожидалось, или может быть эквивалентна rm -rf /
звоните.