2012-01-29 50 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; 
?> 

當我運行這段代碼中,「上線8錯誤意外T_INT_CAST」 WTF得到!?前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 – 2012-01-29 14:04:49

+1

你是對的,這很奇怪:沒有八行代碼。 – 2012-01-29 14:05:20

+0

如果您包含'<?php' – 2012-01-29 14:07:36

回答

2

正如你可以從你的PHP代碼中的十六進制編輯器有不間斷空格之前INTVAL /(INT)鑄造看到:(第二空間)

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

擺脫它,你的代碼應該工作。

+0

非常感謝多人,這真的是一些瘋狂的東西:)永遠不會想到這一點自己! – user871784 2012-01-30 18:22:13

1

你應該想想

PHP_INT_SIZE 

的整數的大小是與平臺相關的,雖然最大值約爲20億是通常的值(這是32位簽名)。 64位平臺的最大值通常約爲9E18。 PHP不支持無符號整數。整數大小可以使用常量PHP_INT_SIZE確定,最大值使用自PHP 4.4.0和PHP 5.0.5以來的常量PHP_INT_MAX。

當試圖從浮點數轉換爲整數時,如果float超出了整數的邊界(在32位平臺上通常爲+/- 2.15e + 9 = 2^31,+/- 9.22e + 18 = 64位平臺上的2^63),結果是未定義的,因爲float沒有足夠的精度來給出精確的整數結果。沒有警告,即使發生這種情況,也不會發出通知!

嘗試改變PHP_INT_SIZE不變,告訴我們有什麼變化

+0

這是如何相關? (這是一個反問的問題......) – 2012-01-29 14:19:23

+0

感謝您的回答!.... 9223372036854775807 ==我的系統上獲得的PHP_INT_MAX常量。除此之外,如果int大小是問題,爲什麼我沒有得到最高值的錯誤? – user871784 2012-01-29 14:25:36

+0

我想過PHP_INT_SIZE,因爲php的行爲在使用較大的整數的情況下,正如我所說的,undefined(甚至未定義) – 2012-02-01 13:06:09

相關問題