Есть ли в yaml_emit () диапазоны?

Я видел эта тема на форуме, что заставляет меня связать упомянутую в теме проблему с целочисленными диапазонами.

По сути, поток предназначен для хранения большого целого числа и получения вывода в виде отрицательного числа.

Однако я не могу найти никакой информации о целочисленных диапазонах из libyaml или расширения PHP YAML. При вызове yaml_emit () с очень большим числом будет ли он приведен / усечен?

Например, если вы звоните yaml_emit() с очень большим целым числом, но это целое число находится в пределах диапазона, разрешенного текущими двоичными файлами PHP, будет ли результат отличаться?

1

Решение

Это тесты, которые я сделал локально:

$ php -v; echo "==="; php --re yaml | head -n 1; echo "==="; php -r 'var_dump(PHP_INT_SIZE); echo yaml_emit([0x7FFFFFFF + 1, -0x80000000 - 1]);'
PHP 7.0.0 (cli) (built: Dec  3 2015 09:31:42) ( ZTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
===
Extension [ <persistent> extension #32 yaml version 2.0.0RC6 ] {
===
int(8)
---
- -2147483648
- 2147483647
...

Это означает, что yaml_emit() будет рассматривать все целые числа содержимого как 32-битные целые числа. Если они находятся вне диапазона, они будут усечены.

Аналогично, это верно даже для 64-битных двоичных файлов PHP:

yaml_emit(0xFFFFFFFF) === yaml_emit(-1)

Кроме того, согласно Источник PECL YAML, похоже, что PHP-целые обрабатываются как longs, которые каким-то образом оказались 32-разрядными знаковыми целыми числами даже в 64-разрядных системах и двоичных файлах.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]