2012-01-29 10 views
2

私はPHPをコーディングする本当に奇妙な動作に走り続けています。ここでは一例です:私はこのコードを実行すると私のPHPインタプリタは狂っている、または私は誰ですか?

<?php 
date_default_timezone_set("Europe/Berlin"); 
$interval1 = (int) 336000; 
$interval2 = (int) 1459200; 
$interval3 = (int) 17403000; 
$interval4 = (int) 43205760; 
$interval5 = (int) 84299520; 
$week =  (int) 604800; 
?> 

、私は WTF「ライン8エラー時に予期しないT_INT_CAST」を取得!?最初の5つのキャストは完璧に機能します。私が何かをキャストしないとき、最初の5つの式は整数になり、最後は文字列に入ります。私は値を比較している間にこれに気付き、明らかに間違った結果を得ました。ここで

は、(コメントに要求されるように)バイナリエディタ出力です:

00000000: 3C 3F 70 68 70 20 0A 64 61 74 65 5F 64 65 66 61 
00000010: 75 6C 74 5F 74 69 6D 65 7A 6F 6E 65 5F 73 65 74 
00000020: 28 22 45 75 72 6F 70 65 2F 42 65 72 6C 69 6E 22 
00000030: 29 3B 0A 24 69 6E 74 65 72 76 61 6C 31 20 3D 20 
00000040: 28 69 6E 74 29 20 33 33 36 30 30 30 3B 20 2F 2F 
00000050: 74 65 73 74 20 69 6E 74 65 72 76 61 6C 20 66 72 
00000060: 6F 6D 20 68 74 74 70 3A 2F 2F 65 63 6B 71 75 61 
00000070: 72 74 65 72 73 2E 63 6F 6D 2F 6D 6F 65 74 65 72 
00000080: 77 6F 6C 66 2F 64 69 61 67 72 61 6D 6D 31 2E 68 
00000090: 74 6D 6C 0A 24 69 6E 74 65 72 76 61 6C 32 20 3D 
000000A0: 20 28 69 6E 74 29 20 31 34 35 39 32 30 30 3B 0A 
000000B0: 24 69 6E 74 65 72 76 61 6C 33 20 3D 20 28 69 6E 
000000C0: 74 29 20 31 37 34 30 33 30 30 30 3B 0A 24 69 6E 
000000D0: 74 65 72 76 61 6C 34 20 3D 20 28 69 6E 74 29 20 
000000E0: 34 33 32 30 35 37 36 30 3B 0A 24 69 6E 74 65 72 
000000F0: 76 61 6C 35 20 3D 20 28 69 6E 74 29 38 34 32 39 
00000100: 39 35 32 30 3B 0A 24 77 65 65 6B 20 3D 20 A0 69 
00000110: 6E 74 76 61 6C 28 36 30 34 38 30 30 29 3B 
+2

これを実行してもエラーは発生しません。 PHP 5.3.6 –

+1

あなたは正しいです、それは奇妙です:8行のコードはありません。 –

+0

'<?php'を含めるとありますか –

答えて

2

を変更しているものを教えしようとするキャスト:(第二空間)

00000100: 39 35 32 30 3B 0A 24 77 65 65 6B 20 3D 20A069

それを取り除くと、あなたのコードが動作するはずです。

+0

本当にありがとう、本当にいくつかのクレイジーなものです:)私は決してこのことを考え出しませんでした! – user871784

1

あなたが整数の程度

PHP_INT_SIZE 

サイズが最大値が、プラットフォームに依存していると考えてください約20億の値が通常の値です(32ビットが署名されています)。 64ビットプラットフォームの最大値は通常約9E18です。 PHPは符号なし整数をサポートしていません。整数のサイズは定数PHP_INT_SIZEを使用して決定でき、最大値はPHP 4.4.0およびPHP 5.0.5以降の定数PHP_INT_MAXを使用して決定できます。

浮動小数点数を整数に変換しようとすると、浮動小数点数が整数の境界を超えている(通常、32ビットプラットフォームで+/- 2.15e + 9 = 2^31、+/- 9.22e + 18 = 64ビットプラットフォームでは2^63)、浮動小数点数には正確な整数結果を与えるのに十分な精度がないため、結果は未定義です。警告がない場合でも、これが発生した場合でも通知は発行されません!

PHP_INT_SIZEが一定の変更と、あなたのPHPコードでバイナリエディタから見ることができるように改行なしスペースがちょうど/ INTVAL(INT)の前にあり

+0

これはどのように関係がありますか? (それは修辞的な質問だった...) –

+0

あなたの答えをありがとう!.... 9223372036854775807 ==私は私のシステム上でPHP_INT_MAX定数として得る。それとは別に、intサイズが問題だった場合、なぜ私は最高値でエラーを取得していませんか? – user871784

+0

大きな整数を使用した場合のPHPの動作は、定義されていない(定義されていなくても) –

関連する問題