-
整型
(計算機語言)
鎖定
整型定義
一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數。【以PHP語言為例】
整型語法
如果用八進制符號,數字前必須加上 0(零),用十六進制符號數字前必須加上 0x。
例. 整數文字表達:【以PHP語言為例】
<?php $a=1234;# 十進制數 $a=-123;#一個負數 $a=0123;# 八進制數(等於十進制的83) $a=0x1A;# 十六進制數(等於十進制的26) ?>
在字面上,整型變量正式的結構可以為:
<?php decimal:[1-9][0-9]* |0 hexadecimal:0[xX][0-9a-fA-F]+ octal:0[0-7]+ integer:[+-]? decimal |[+-]?hexadecimal |[+-]?octal ?>
----------------------------------------------------------------------------------------------------------
注意:整型數的字長和平台有關,儘管通常最大值是大約二十億(32 位有符號)。
另:PHP 不支持無符號整數。
分類
整型整型常量
整型八進制整常數
以下各數是合法的八進制數:
015(十進制為13) 0101(十進制為65) 0177777(十進制為65535)
以下各數不是合法的八進制數:
256(無前綴0) 0382(包含了非八進制數碼) -0127(出現了負號)
整型十六進制整常數
十六進制整常數的前綴為0X或0x。其數碼取值為0~9,A~F或a~f。
以下各數是合法的十六進制整常數:
0X2A(十進制為42) 0XA0 (十進制為160) 0XFFFF (十進制為65535)
以下各數不是合法的十六進制整常數:
5A (無前綴0X) 0X3H (含有非十六進制數碼)
整型十進制整常數
十進制整常數沒有前綴。其數碼為0~9。
以下各數是合法的十進制整常數:
237 -568 65535 1627
以下各數不是合法的十進制整常數:
023 (不能有前導0) 23D (含有非十進制數碼)
在程序中是根據前綴來區分各種進制數的。因此在書寫常數時不要把前綴弄錯造成結果不正確。例如,數組int power_of_10[4]={0001,0010,0100,1000}的初值會被解釋為{1,8,64,1000}。
整型整型常數的後綴
在16位字長的機器上,基本整型的長度也為16位,因此表示的數的範圍也是有限定的。十進制無符號整常數的範圍為0~65535,有符號數為-32768~+32767。八進制無符號數的表示範圍為0~0177777。十六進制無符號數的表示範圍為0X0~0XFFFF或0x0~0xFFFF。如果使用的數超過了上述範圍,就必須用長整型數來表示。長整型數是用後綴“L”或“l”來表示的。例如:
[1]
十進制長整常數 158L (十進制為158) 358000L (十進制為-358000)
八進制長整常數 012L (十進制為10) 077L (十進制為63) 0200000L (十進制為65536)
十六進制長整常數 0X15L (十進制為21) 0XA5L (十進制為165) 0X10000L (十進制為65536)
長整數158L和基本整常數158在數值上並無區別。但對158L,因為是長整型量,C編譯系統將為它分配4個字節存儲空間。而對158,因為是基本整型,根據計算機的內部字長和編譯器的版本分配2或4個字節的存儲空間。因此在運算和輸出格式上要予以注意,避免出錯。對長整型都表示不了的大數,某些編譯器規定可有64位整常數表示,後綴為“LL”或“ll”。有時,因為特殊需要,可能要對短整型進行特殊標記,只有部分編譯器支持短整型的後綴“S”或“s”。無符號數也可用後綴表示,整型常數的無符號數的後綴為“U”或“u”。例如:358u,0x38Au,235Lu均為無符號數。前綴,後綴可同時使用以表示各種類型的數。如0XA5Lu表示十六進制無符號長整數A5,其十進制為165。
整型整型變量
整型變量可分為以下幾類:
[2]
整型基本型
整型短整型
類型説明符為short int或short,在內存中佔2個字節,其取值為短整常數。
整型長整型
類型説明符為long int或long,在內存中佔4個字節,其取值為長整常數。
4.64位整型(非ANSI標準)
類型説明符為__int64、long long int或long long,在內存中佔8個字節,其取值為64位整常數。
整型無符號型
類型説明符為unsigned。它可以單獨使用代表unsigned int,也可以作為前綴,都表示無符號整數,即永遠為非負的整型變量,大於0的數據範圍約擴大為原來的2倍。各種無符號類型量所佔的內存空間字節數與相應的有符號類型量相同。但由於省去了符號位,故不能表示負數。下表列出了C++中各類整型量所分配的內存字節數及數的表示範圍。
整型對比
類型説明符 | 數的範圍 | 分配字節數 | 備註 |
short | -32768~32767 | ■■ | |
short int | -32768~32767 | ■■ | |
signed int | -2147483648~2147483647 | ■■■■ | |
unsigned int | 0~4294967295 | ■■■■ | |
long int | -2147483648~2147483647 | ■■■■ | |
unsigned long | 0~4294967295 | ■■■■ | |
long long | -9223372036854775808~9223372036854775807 | ■■■■■■■■ | |
unsigned long long | 0~18446744073709551615 | ■■■■■■■■ | |
__int128 | -0x80000000000000000000000000000000~0x7fffffffffffffffffffffffffffffff | ■■■■■■■■■■■■■■■■ | C++14及以上支持,但暫不支持cin、cout輸入輸出 |
unsigned __int128 | 0~__INT128_MAX*2+1 | ■■■■■■■■■■■■■■■■ | 同上 |
整型整數溢出
如果你指定一個數超出了 integer 的範圍,將會被解釋為 float。同樣如果你執行的運算結果超出了 integer 範圍,也會返回 float。【以PHP語言為例】
<?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 var_dump(25/7);//float(3.5714) 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 下返回結果是最小負數(-214748),而在 Windows 下返回結果是零(0)。
【以下以C/C++語言為例,陳述一下整型的知識】:
a.C/C++對整型長度的規定是為了執行效率,將int定義為機器字長可以取得最大的執行速度;
c.C和C++對enum的規定有所不同,這裏不描述;
d.修飾整型正負的有signed和unsigned,對於int默認為signed;
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字節長,因為它的長度在不同的編譯器上並不相同。