1、定義:一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數。
參見:任意長度整數 / GMP,
浮點數和 任意
精度數學庫 / BCMath。
2、語法:
如果用八進制符號,數字前必須加上 0(零),用十六進制符號數字前必須加上 0x。
例子 6-1. 整數文字表達:
<?php$a=1234;#十進制數$a=-123;#一個負數$a=0123;#八進制數(等於十進制的83)$a=0x1A;#十六進制數(等於十進制的26)?>
<?phpdecimal:[1-9][0-9]*|0hexadecimal:0[xX][0-9a-fA-F]+octal:0[0-7]+integer:[+-]?decimal|[+-]?hexadecimal|[+-]?octal?>
----------------------------------------------------------------------------------------------------------
注意:整型數的
字長和平台有關,儘管通常最大值是大約二十億(32 位有符號)。
3、整數溢出:
如果你指定一個數超出了 integer 的範圍,將會被解釋為 float。同樣如果你執行的運算結果超出了 integer 範圍,也會返回 float。
<?php$large_number=1;var_dump($large_number);//輸出為:int(1)$large_number=1;var_dump($large_number);//輸出為:float(1)//同樣也適用於十六進制表示的整數:var_dump(0x80000000);//輸出為:float(1)$million=1000000;$large_number=50000*$million;var_dump($large_number);//輸出為:float(50000000)?>
PHP 中沒有整除的
運算符。1/2 產生出
浮點數 0.5。您可以總是捨棄小數部分,或者使用 round() 函式。
<?phpvar_dump(25/7);//float(3.5714)var_dump((int)(25/7));//int(3)var_dump(round(25/7));//float(4)?>
4、轉換為整型:
要明示地將一個值轉換為 integer,用 (int) 或 (integer)
強制轉換。不過大多數情況下都不需要強制轉換,因為當運算符,函式或
流程控制需要一個 integer 參數時,值會自動轉換。您還可以通過函式 intval() 來將一個值轉換成整型。
參見:類型戲法。
FALSE 將產生出0(零),TRUE 將產生出1(壹)。
當從浮點數轉換成整數時,數字將被取整(丟棄小
數位)。
注意:如果浮點數超出了整數範圍(通常為 +/- 2.15e+9 = 2^31),則結果不確定,因為沒有足夠的精度使浮點數給出一個確切的整數結果。在此情況下沒有警告,甚至沒有任何通知!
(譯者註:)在 Linux 下返回結果是最小負數(-214748),而在 Windows 下返回結果是零(0)。
【以下以C/C++語言為例,陳述一下整型的知識】:
a.C/C++對整型長度的規定是為了執行效率,將int定義為
機器字長可以取得最大的執行速度;
c.C和C++對enum的規定有所不同,這裡不描述;
d.修飾整型正負的有signed和
unsigned,對於int默認為signed;
e.修飾 int 大小的有
short和long,部分
編譯器還擴展了一些更長的整型,比如long long和__int64, C99中增加了long long和unsigned long long;
f int 的長度與
機器字長相同,16位的編譯器上int長16位,32位的編譯器上int長32位;
g short int的長度
小於等於int 的長度,注意它們可能長度相等,這取決於編譯器;
h long int 的長度大於等於int 的長度,注意它們可能長度相等,這取決於編譯器;
i.char 的長度應當可以包容得下一個字元,大部分系統中就是一個
位元組,而有的系統中可能是4個位元組,因為這些系統中一個字元需要四個位元組來描述;
j.char 的正負取決於
編譯器,而編譯器的決定取決於作業系統,在不同的編譯器中char可能等同於signed char,也可能等同於unsigned char;
總結:
a. 出於效率考慮,應該儘量使用int和unsigned int;
b. 當需要指定容量的整型時,不應該直接使用
short、int、long等,因為在不同的編譯器上它們的容量不相同。此時應該定義它們相應的宏或類型,比如在VC++6.0中,可以如下定義:
[Copy to clipboard]CODE:
typedef unsigned char UBYTE;
typedef signed char SBYTE;
typedef unsigned short int UWORD;
typedef signed short int SWORD;
typedef unsigned int UDWORD;
typedef signed int SDWORD;
typedef unsigned __int64 UQWORD;
typedef signed __int64 SQWORD;
然後在代碼中使用UBYTE、SBYTE、UWORD等,這樣當
代碼移植的時候只需要修改相應的類型即可。
定義自己的類型雖然在代碼移植的時候只需要修改一處即可,但仍然屬於原始碼級別的修改,所以 C++ 2.0 中將這些類型定義在模板中,可以做到代碼移植時無需修改代碼。
c. 在定義char時,一定要加上signed或unsigned,因為它的正負在不同的
編譯器上並不相同。
d. 不要想當然的以為char是1位元組長,因為它的長度在不同的編譯器上並不相同。