做(zuò)自(zì)由與創造的先行(xíng)者

Integer 整型

PHP中文手冊

int 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某個數(shù)。

參見(jiàn)

浮點數(shù)

任意精度/BCMath

任意長(cháng)度整數(shù)/GMP

語法 ¶

整型值 Int 可(kě)以使用十進制,十六進制,八進制或二進制表示,前面可(kě)以加上(shàng)可(kě)選的符号(- 或者 +)。 可(kě)以用 負運算符 來表示一(yī)個負的int。

要(yào)使用八進制表達,數(shù)字前必須加上(shàng) 0(零)。 PHP 8.1.0 起,八進制表達也可(kě)以在前面加上(shàng) 0o 或者 0O 。 要(yào)使用十六進制表達,數(shù)字前必須加上(shàng) 0x。要(yào)使用二進制表達,數(shù)字前必須加上(shàng) 0b。

從(cóng) PHP 7.4.0 開(kāi)始,整型數(shù)值可(kě)能(néng)會包含下(xià)劃線 (_),為(wèi)了(le)更好的閱讀體驗,這(zhè)些下(xià)劃線在展示的時(shí)候,會被 PHP 過濾掉。

示例 #1 整數(shù)文字表達

<?php

$a = 1234; // 十進制數(shù)

$a = 0123; // 八進制數(shù) (等于十進制 83)

$a = 0o123; // 八進制數(shù) (PHP 8.1.0 起)

$a = 0x1A; // 十六進制數(shù) (等于十進制 26)

$a = 0b11111111; // 二進制數(shù)字 (等于十進制 255)

$a = 1_234_567; // 整型數(shù)值 (PHP 7.4.0 以後)

?>

int literal 的結構形式從(cóng) PHP 8.1.0 開(kāi)始是(之前不允許使用 0o 或 0O 八進制前綴,并且 PHP 7.4.0 之前不允許使用下(xià)劃線):

decimal : [1-9][0-9]*(_[0-9]+)*

| 0

hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*

octal : 0[oO]?[0-7]+(_[0-7]+)*

binary : 0[bB][01]+(_[01]+)*

integer : decimal

| hexadecimal

| octal

| binary

整型數(shù) int 的字長(cháng)和(hé)平台有關,盡管通(tōng)常最大值是大約二十億(32 位有符号)。64 位平台下(xià)的最大值通(tōng)常是大約 9E18。 PHP 不支持無符号的 int。int 值的字長(cháng)可(kě)以用常量 PHP_INT_SIZE來表示, 最大值可(kě)以用常量 PHP_INT_MAX 來表示, 最小值可(kě)以用常量 PHP_INT_MIN 表示。

整數(shù)溢出 ¶

如(rú)果給定的一(yī)個數(shù)超出了(le) int 的範圍,将會被解釋為(wèi) float。同樣如(rú)果執行(xíng)的運算結果超出了(le) int 範圍,也會返回 float。

示例 #2 32 位系統下(xià)的整數(shù)溢出

<?php

$large_number = 2147483647;

var_dump($large_number); // int(2147483647)

$large_number = 2147483648;

var_dump($large_number); // float(2147483648)

$million = 1000000;

$large_number = 50000 * $million;

var_dump($large_number); // float(50000000000)

?>

示例 #3 64 位系統下(xià)的整數(shù)溢出

<?php

$large_number = 9223372036854775807;

var_dump($large_number); // int(9223372036854775807)

$large_number = 9223372036854775808;

var_dump($large_number); // float(9.2233720368548E+18)

$million = 1000000;

$large_number = 50000000000000 * $million;

var_dump($large_number); // float(5.0E+19)

?>

PHP 沒有 int 除法取整運算符,要(yào)使用 intdiv() 實現。 1/2 産生出 float 0.5。 值可(kě)以舍棄小數(shù)部分,強制轉換為(wèi) int,或者使用 round() 函數(shù)可(kě)以更好地(dì)進行(xíng)四舍五入。

<?php

var_dump(25/7); // float(3.5714285714286)

var_dump((int) (25/7)); // int(3)

var_dump(round(25/7)); // float(4)

?>

轉換為(wèi)整型 ¶

要(yào)明(míng)确地(dì)将一(yī)個值轉換為(wèi) int,用 (int) 或 (integer) 強制轉換。不過大多數(shù)情況下(xià)都(dōu)不需要(yào)強制轉換,因為(wèi)當運算符,函數(shù)或流程控制需要(yào)一(yī)個 int 參數(shù)時(shí),值會自(zì)動轉換。還可(kě)以通(tōng)過函數(shù) intval() 來将一(yī)個值轉換成 int 整型。

将 resource 轉換成 int 時(shí), 結果會是 PHP 運行(xíng)時(shí)為(wèi) resource 分配的唯一(yī)資源号。

參見(jiàn):類型轉換的判别。

從(cóng)布爾值轉換 ¶

false 将産生出 0(零),true 将産生出 1(壹)。

從(cóng)浮點型轉換 ¶

當從(cóng)浮點數(shù) float 轉換成整數(shù) int時(shí),将向下(xià)取整。自(zì) PHP 8.1.0 起,當将非整數(shù)類型的 float 轉換為(wèi)失去精度的 int 時(shí),會發出棄用通(tōng)知。

<?php

function foo($value): int {

return $value;

}

var_dump(foo(8.1)); // 自(zì) PHP 8.1.0 起:“Deprecated: Implicit conversion from float 8.1 to int loses precision”

var_dump(foo(8.1)); // PHP 8.1.0 之前為(wèi) 8

var_dump(foo(8.0)); // 8 in both cases

var_dump((int)8.1); // 8 in both cases

var_dump(intval(8.1)); // 8 in both cases

?>

如(rú)果浮點數(shù)超出了(le) int 範圍(32 位平台下(xià)通(tōng)常為(wèi) +/- 2.15e+9 = 2^31,64 位平台下(xià),通(tōng)常為(wèi) +/- 9.22e+18 = 2^63),則結果為(wèi)未定義, 因為(wèi)沒有足夠的精度給出一(yī)個确切的 int 結果。 在此情況下(xià)沒有警告,甚至沒有任何通(tōng)知!

注意:

NaN 和(hé) Infinity 在轉換成 int 時(shí)是零。

警告

絕不要(yào)将未知的分數(shù)強制轉換為(wèi) int,這(zhè)樣有時(shí)會導緻不可(kě)預料的結果。

<?php

echo (int) ( (0.1+0.7) * 10 ); // 顯示 7!

?>

參見(jiàn)關于浮點數(shù)精度的警告。

從(cóng)字符串轉換 ¶

如(rú)果 string 是 numeric 或者前導數(shù)字, 則将它解析為(wèi)相應的 int 值,否則将轉換為(wèi)零(0)。

從(cóng) NULL 轉換 ¶

null 會轉換為(wèi)零(0)。

從(cóng)其它類型轉換 ¶

警告

沒有定義從(cóng)其它類型轉換為(wèi) int 的行(xíng)為(wèi)。 不要(yào)依賴任何現有的行(xíng)為(wèi),因為(wèi)它會未加通(tōng)知地(dì)改變。

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:Float 浮點型
上(shàng)一(yī)篇:Boolean 布爾類型