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 の int はlongs として扱われるようで、64 ビット システムおよびバイナリでも、どういうわけか 32 ビットの符号付き整数になってしまいました。

于 2016-03-13T10:28:01.113 に答える