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

【讨论】:

以上是关于yaml_emit() 有范围吗?的主要内容,如果未能解决你的问题,请参考以下文章

swtich能判断取值范围吗

C语言中有范围解析运算符吗?

“范围”是标准声明吗?

使用 Spring Security 时,oauth 范围和角色之间有啥区别吗? [复制]

Mustachio:没有范围的 if 语句 - 有可能吗?

iPhone EDGE/3G网口范围?有人知道吗?