1

在论坛上看到了这个帖子,这让我将帖子中提到的问题与整数范围联系起来。

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

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

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

4

1 回答 1

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

于 2016-03-13T10:28:01.113 回答