yaml_emit() 有范围吗?
Posted
技术标签:
【中文标题】yaml_emit() 有范围吗?【英文标题】:Does yaml_emit() have ranges? 【发布时间】:2016-03-13 08:12:14 【问题描述】:我看到this thread on a forum,这让我将线程中提到的问题与整数范围联系起来。
基本上,线程是关于存储一个大整数并将输出作为负数。
但是,我无法从 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 source,PHP 整数似乎被处理为long
s,即使在 64 位系统和二进制文件中,它也以某种方式最终成为 32 位有符号整数。
【讨论】:
以上是关于yaml_emit() 有范围吗?的主要内容,如果未能解决你的问题,请参考以下文章