yaml_emit() 有范围吗?

Does yaml_emit() have ranges?

我看到了 this thread on a forum,这让我将线程中提到的问题与整数范围联系起来。

基本上,线程是关于存储一个大整数并输出负数。

但是我无法从 libyaml 或 PHP YAML 扩展中找到有关整数范围的任何信息。当用非常大的数字调用 yaml_emit() 时,它会是 casted/truncated 吗?

例如,如果您用一个非常大的整数调用 yaml_emit(),但该整数在当前 PHP 二进制文件允许的范围内,结果会有所不同吗?

这些是我在本地做的测试:

$ 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 整数被处理为 longs,即使在 64 位上,它也以某种方式最终成为 32 位有符号整数系统和二进制文件。