2016-03-13 1 views
1

Я видел this thread on a forum, что заставляет меня связать проблему, упомянутую в потоке, с целыми диапазонами.Имеет ли yaml_emit() диапазоны?

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

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

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

ответ

0

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

$ 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 source, представляется, что PHP Интс обрабатываются как long с, что так или иначе заканчивали, как 32-разрядных целых чисел со знаком даже в 64-битных системах и двоичных файлах.

Смежные вопросы