簡體   English   中英

PHP中32到64位的“Gotchas”

[英]32 to 64 bit “Gotchas” in PHP

上周末我改變了網站的webhosts。 我所使用的主機服務器是32位操作系統,我移動的主機服務器是64位操作系統。 出乎意料的是,我的一些PHP腳本開始提供不正確的結果。

在我的情況下,<<和>>(位移)操作是罪魁禍首。 我最終不得不用0xFFFFFFFF掩蓋結果,然后改變結果,如果它為負,它就像以前一樣工作。

我應該尋找我的PHP腳本中是否還有其他可能存在的問題?

它是一種高級語言,因此任何非位相關的(按位運算符,位移)都是相同的。

整數可以是64位而不是32位。 有一些奇怪的情況可能會導致問題。

位操作需要特別小心,以便在系統/體系結構之間進行移植。

在C中,<<和>>操作可以通過使用無符號變量進行移植,這取消了負數的1 / twos補碼規則。

作為一般規則,不要使用固定長度的掩碼進行位操作(如&和|)。 這些都取決於架構。

例如。 重置最后4位:掩碼0xF0將在8位架構上工作,但不能在16位上工作。 結果將是不同的(16位可能具有未設置在掩碼中的其他位)。

要克服這個問題,請使用〜運算符。 掩碼~0xF等效於0xF0,但適用於任何架構。 除最后4位之外的所有位都將被復位

strtotime在64位上表現不同。 來自PHP.net:

注意:

時間戳的有效范圍通常是從星期五,1901年12月13日20:45:54 UTC到星期二,2038年1月19日03:14:07 UTC。 (這些是與32位有符號整數的最小值和最大值相對應的日期。)此外,並非所有平台都支持負時間戳,因此您的日期范圍可能不會早於Unix時期。 這意味着例如1970年1月1日之前的日期將無法在Windows,某些Linux發行版和一些其他操作系統上運行。 PHP 5.1.0和更新的版本克服了這個限制。

對於64位版本的PHP,時間戳的有效范圍實際上是無限的,因為64位可以代表任何方向上大約2930億年。

我們有代碼正在做strtotime('0000-00-00')並且期望結果是假的,當我們移動到64位時我們得到了一個負整數。

當你依賴32位二進制數據表示時,你會看到唯一的問題。 主要是因為PHP使用有符號整數,你會看到Hashing,密鑰生成等問題...當用(int)顯式地轉換為int時,數字> 2 ^ 32將包裝在64位環境中它們不包裝的地方除非他們當然> 2 ^ 64。

4對8位示例:

十進制值問題:

     0010 >> 1 =      0001   [ 1 dec ]
0000 0010 >> 1 = 0000 0001   [ 1 dec ]

這些都產生相同的結果(十進制),但是:

     0100 << 1 =      1000   [ -8 dec ]
0000 0100 << 1 = 0000 1000   [ 16 dec ]

包裝問題:

     1000 << 1 =      0000   [  0 dec ]
0000 1000 << 1 = 0001 0000   [ 32 dec ]

所有整數/浮點運算將被視為64位值,因此如果您的最終結果依賴於32位塊,則必須對此進行補償。

浮點除法的結果將受到增加到64位的影響; 因此,如果您的代碼執行某些愚蠢的操作,例如將浮點除法的結果與硬編碼常量進行比較,則期望它會中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM