2016-07-26 26 views
2

據我所知,有(int)鑄造輪趨向於零了一些,但後來我開始比其他10個基地周圍戳,現在我不完全相信別人(int)什麼呢:在PHP中,(int)實際上做了什麼?

$a = 050; // an octal number 

echo $a; // output is ----> 40 

然而

$a = '050'; 

echo (int)$a; // output is ----> 50 

所以我認爲(int)除了舍入零也剪輯前導零。不過,如果我做同樣的運動在第二代碼塊(上圖)與二元我沒有得到我的期望:

$a = '0b010'; 

echo (int)$a; // output is ----> 0 

,並在十六進制:

$a = '0x050'; 

echo (int)$a; // output is ----> 0 

即使使用十進制科學符號給出了一個古怪的結果:

$a = 5e6; 
$b = '5e6'; 

echo $a; // output is ----> 5000000 
echo (int)$b; // output is ----> 5 

是什麼鑄造用(int)整數究竟意味着什麼?除了剝離小數點和浮點數後的所有內容之外,(int)是否逐字符地分析轉換的字符串,並返回所有前導數字非零字符的拼接?就像這樣:

function intCast($str) { 

    $length = strlen($str); 

    $returnVal = ''; 

    for($i = 0; $i < $length; $i++) { 

     // Note: ord() values 48 to 57 represent 0 through 9 

     if ($returnVal === '' && ord($str[$i]) == 48) { 

      continue; // leading zeroes are OK but don't concatenate 

     } else if (ord($str[$i]) > 48 && ord($str[$i]) < 58) { 

      $returnVal .= $str[$i]; 

     } else { 

      break; 

     } 

    } 


    return (strlen($returnVal) > 0) ? $returnVal : 0; 

} 

***請注意,這link似乎並沒有提供足夠的答案。

+1

我真的不明白爲什麼鏈接的問題沒有提供足夠的答案。 – Jocelyn

+1

[文檔](http://php.net/manual/en/language.types.string.php#language.types.string.conversion)告訴您字符串如何轉換爲數字。只是忽略關於浮動的部分,你會看到它對於整數如何工作。 –

+1

'$ a = 050'回聲'40',因爲050被認爲是八進制。 – Aaron

回答

3

'050'是一個字符串,PHP在做類型轉換的第一份工作是規範該字符串:

echo '050' + 1 -> echo '50' + 1 -> echo 50 + 1 -> echo 51 -> 51 

050本身是一個八進制數,它已經是一個整數,所以唯一PHP有do將其轉換爲base10數字輸出:

echo 050 + 1 -> echo 40 + 1 -> echo 41 -> 41 
+0

有道理......用科學計數法,(int)不會首先將'1e6'轉換爲實際的數字並輸出100000 ......它會將'1e6'視爲數字1,後面跟着一個非數字,只是輸出1它看起來像 –

+0

由(int)強制轉換的二進制「string」'0b111'不是111,而是數字0後跟一個非數字? –

+1

當執行string-> int轉換時,會導致零引數被丟棄,這意味着'0b11' - >'b11' - >'0',因爲'b'不是一個有效的整數。它會是十六進制,但它不是'0xb' –

相關問題