整型

一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數。

參見任意長度整數(GMP)浮點數任意精度數學庫(BCMath)

語法

整型值可以用十進位,十六進位或八進位符號指定,前面可以加上可選的符號(- 或是 +)。

若果用八進位符號,數字前必須加上 0(零),用十六進位符號數字前必須加上 0x

例子 11-1. 整數文字表達

<?php
$a 
1234// 十進位數
$a = -123// 一個負數
$a 0123// 八進位數(等於十進位的 83)
$a 0x1A// 十六進位數(等於十進位的 26)
?>
在字面上,整型變量正式的結構可以為:

decimal     : [1-9][0-9]*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+

octal       : 0[0-7]+

integer     : [+-]?decimal
            | [+-]?hexadecimal
            | [+-]?octal

整型數的字長和平台有關,儘管通常最大值是大約二十億(32 位有符號)。PHP 不支援無符號整數。

警示

若果向八進位數傳遞了一個非法數字(即 8 或 9),則後面其餘數字會被忽略。

例子 11-2. 八進位數的怪事

<?php
var_dump
(01090); // 010 octal = 8 decimal
?>

整數溢出

若果給定的一個數超出了 integer 的範圍,將會被解釋為 float。同樣若果執行的運算結果超出了 integer 範圍,也會返回 float

<?php
$large_number 
=  2147483647;
var_dump($large_number);
// 輸出為:int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// 輸出為:float(2147483648)

// 同樣也適用於十六進位表示的整數:
var_dump0x80000000 );
// 輸出為:float(2147483648)

$million 1000000;
$large_number =  50000 $million;
var_dump($large_number);
// 輸出為:float(50000000000)
?>

警示

不幸的是 PHP 中有個 bug,因此當有負數參與時結果並不總是正確。例如當運算 -50000 * $million 時結果是 -429496728。不過當兩個運算數都是正數時就沒問題。

這個問題已經在 PHP 4.1.0 中解決了。

PHP 中沒有整除的運算符。1/2 產生出 float 0.5。可以總是捨棄小數部分,或是使用 round() 函數。

<?php
var_dump
(25/7);         // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7));  // float(4)
?>

轉換為整形

要明示地將一個值轉換為 integer,用 (int)(integer) 強制轉換。不過大多數情況下都不需要強制轉換,因為當運算符,函數或流程控制需要一個 integer 參數時,值會自動轉換。還可以通過函數 intval() 來將一個值轉換成整型。

參見類型戲法

布林值轉換

FALSE 將產生出 0(零),TRUE 將產生出 1(壹)。

浮點數轉換

當從浮點數轉換成整數時,數字將被取整(丟棄小數位)。

若果浮點數超出了整數範圍(通常為 +/- 2.15e+9 = 2^31),則結果不確定,因為沒有足夠的精度使浮點數給出一個確切的整數結果。在此情況下沒有警示,甚至沒有任何知會!

【譯者注】在 Linux 下返回結果是最小負數(-2147483648),而在 Windows 下返回結果是零(0)。

警示

決不要將不明的分數強制轉換為 integer,這樣有時會導致意外的結果。

<?php
echo (int) ( (0.1+0.7) * 10 ); // 顯示 7!
?>

更多訊息見浮點數精度

從其它類型轉換

注意

沒有定義從其它類型轉換為整型的行為。目前的行為和值先轉換為布林值一樣。不過不要依靠此行為,因為它會未加知會地改變。