«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Почему Почему 2021/08/20 17:39:56  №2134484 1
Почему (int)(float)PHP_INT_MAX; минусуется в --9223372036854775808 ?
Ответы: >>2134546 >>2134831
Аноним 2021/08/20 18:25:22  №2134546 2
Аноним 2021/08/20 23:33:53  №2134831 3
>>2133997

Да, это файл-обработчик.

>>2133917

Там можно настроить права доступа к каждой таблице. Например: юзер может только добавлять или просматривать комменты и не может удалять их.

>>2134484

Это сочетание особенности float с особенностью представления отрицательных чисел в int.

float - это приблизительный тип. В 64-битном PHP float сохраняет только 15-16 значащих цифр числа и порядок. То есть, он хранит число в виде M * 2 N (где M и N целые). Ты можешь убедиться, попробовав сделать var_dump(1000000000000000000000123.0) - "123" на конце потеряется, так как PHP сохраняет только первые 15-16 цифр. И PHP выведет 1e24 - то есть, 1 * 1024. Последние цифры потерялись.

Если хочешь узнать подробнее, погугли IEEE754. Этот стандарт описывает, как числа с плавающей запятой преобразуются в двоичный вид.

Когда ты преобразуешь PHP_INT_MAX в float, точности не хватает, чтобы сохранить все цифры числа и последние цифры округляются в большую сторону. Попробуй сдампить var_dump(PHP_INT_MAX) и var_dump((float)PHP_INT_MAX); и сравнить числа. Ты увидишь различие из-за округления.

Округление происходит в большую сторону и число становится больше PHP_INT_MAX.

Когда ты пытаешься преобразовать это число обратно в int, возникает проблема: число больше, чем максимальное положительное значение int и преобразовать в int его невозможно. Правильно, конечно, было бы выдавать ошибку в таком случае, но PHP все равно его преобразует, при этом получается отрицательное число.

Ты можешь сдампить var_dump((int)1e19); и увидеть отрицательное число.

Но почему при переполнении int получается отрицательное число? Это особенность хранения int в компьютере. Рассмотрим ячейку памяти размером в 1 байт. В ней можно сохранить число от 0 до 255. Если мы хотим хранить в ней еще и отрицательные числа, то мы должны придумать какой-то способ, как их закодировать. Можно, например, договориться так: числа от 0 до 127 обозначают сами себя, а числа от 128 до 255 обозначают -128 ... -1 соответственно. Это называется "дополнительный код" (дополнение до 2).

Почему придумали именно такую систему? Потому что с ней компьютеру просто и удобно складывать и вычитать положительные и отрицательные числа. Человеку такое представление не очень удобно, но он потерпит.

Теперь если мы в такую ячейку попытаемся записать слишком большое число, например число 129, то при чтении оно будет воспринято как -127, так как мы ранее договорились, что числа > 128 обозначают отрицательные числа.

Вот примерно то же самое происходит при преобразовании в int. Число слишком большое и оно попадает в область, которая представляет отрицательные значения.

Почитать подробнее про дополнительный код: https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4