PHP 中的整數(shù)是 C 語(yǔ)言的中的long 類型,是有符號(hào)的,最大值是 2^31 。在 64 位平臺(tái)上,long可以達(dá)到 2^63.
這樣的話,有些PHP 函數(shù)輸出的結(jié)果在各個(gè)平臺(tái)上就會(huì)不一致了。
php -r "echo ip2long('255.255.255.255');" 在64位平臺(tái)下是: 4294967295, 在32位平臺(tái)下是 -1。
還有比如 filesize 在 文件 大于 2G的時(shí)候,在不同的平臺(tái)下結(jié)果就不一致了。
解決這個(gè)問(wèn)題很簡(jiǎn)單,sprintf("%u", filesize($file)). 把結(jié)果轉(zhuǎn)換為 一個(gè)字符串。為什么結(jié)果會(huì)一樣呢:
無(wú)符號(hào)數(shù) 4294967295 的補(bǔ)碼 和 有符號(hào)數(shù) -1 的補(bǔ)碼 是一樣的。
類似,返回值為int 最后結(jié)果可能大于 2^31 的函數(shù),都要用這樣的方法處理。
注意,返回的雖然是一個(gè)字符串,但是,當(dāng)進(jìn)行四則運(yùn)算的時(shí)候,PHP會(huì)自動(dòng)裝換。
如果 數(shù)大于 2^31 會(huì)轉(zhuǎn)換為 int 如果大于 了,就轉(zhuǎn)換為double。
Tag標(biāo)簽: php,平臺(tái)兼容性