PHP: в 32-битной системе INT_MAX отображается неправильно? - PullRequest
1 голос
/ 12 сентября 2010

Я просто хотел проверить переполнение для целого числа, такого как в C (ну, если бы оно было чуть больше целого числа в любом случае). Когда я посмотрел, действительно ли PHP делает то, что я ему сказал, кажется, что по какой-то причине он не работает. Вот мои тесты проблемы:

define('INT_MAX', 0x7FFFFFFF);
print "In decimal: " . hexdec(INT_MAX) . "<br/>";
print "In decimal: " . hexdec(0x7FFFFFFE) . "<br/>"; //Under int_max
print "In hex: " . dechex(hexdec(INT_MAX)) . "<br/>";
print "Float: " . ((bool)is_float(INT_MAX)?'true':'false') . "<br/>";

Результаты:

В десятичном виде: 142929835591
В десятичном виде: 142929835590
В шестнадцатеричном: 47483647
Float: false

Как я видел в руководстве, он будет брошен на плаву, если его свергнут, но, похоже, нет, и он явно намного выше. Я сошел с ума и что-то упустил здесь, или есть какая-то странная проблема, о которой мне действительно нужно знать при работе с шестнадцатеричной системой в PHP?

Ответы [ 2 ]

5 голосов
/ 12 сентября 2010

Ваша программа не имеет смысла, потому что вы берете 0x7FFFFFFF, который равен 2147483647, и затем обрабатываете его как 0x2147483647, который равен 142929835591 в десятичном виде.

В любом случае, PHP уже имеетконстанта, которую вы можете использовать:

var_dump(PHP_INT_MAX + 1); // converted to float
1 голос
/ 12 сентября 2010
define('INT_MAX', 0x7FFFFFFF);

Это определяет INT_MAX как целое число 2147483647.Нет необходимости интерпретировать его как шестнадцатеричное число.Если вы действительно хотите использовать INT_MAX в качестве буквального шестнадцатеричного значения, то вам нужно объявить его как '7FFFFFFF' (внутри строки);тогда функция hexdec будет интерпретировать шестнадцатеричное представление и преобразовать его в десятичное значение.

print(dechex(INT_MAX) . "\n");

Это печатает "7fffffff".

...