版權歸原作者所有,如有侵權,請聯(lián)系我們

[科普中國]-整型

科學百科
原創(chuàng)
科學百科為用戶提供權威科普內容,打造知識科普陣地
收藏

計算機中的一個基本的專業(yè)術語,指沒有小數(shù)部分的數(shù)據(jù)。整型可以用十進制,十六進制或八進制符號指定,前面可以加上可選的符號(- 或者 +)。包括整型常量和整型變量,整型變量又包括短整型、基本整型、長整型,它們都分為有符號和無符號兩種版本,是一種智能的計算方式。

定義一個 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一個數(shù)。【以PHP語言為例】

參見:任意長度整數(shù) / GMP,浮點數(shù)和 任意精度數(shù)學庫 / BCMath。

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

如果用八進制符號,數(shù)字前必須加上 0(零),用十六進制符號數(shù)字前必須加上 0x。

例. 整數(shù)文字表達:【以PHP語言為例】

在字面上,整型變量正式的結構可以為:

----------------------------------------------------------------------------------------------------------

注意:整型數(shù)的字長和平臺有關,盡管通常最大值是大約二十億(32 位有符號)。

另:PHP 不支持無符號整數(shù)。

分類

整型常量八進制整常數(shù)必須以0開頭,即以0作為八進制數(shù)的前綴。數(shù)碼取值為0~7。八進制數(shù)通常是無符號數(shù)。

以下各數(shù)是合法的八進制數(shù):

015(十進制為13) 0101(十進制為65) 0177777(十進制為65535)

以下各數(shù)不是合法的八進制數(shù):

256(無前綴0) 0382(包含了非八進制數(shù)碼) -0127(出現(xiàn)了負號)

十六進制整常數(shù)十六進制整常數(shù)的前綴為0X或0x。其數(shù)碼取值為0~9,A~F或a~f。

以下各數(shù)是合法的十六進制整常數(shù):

0X2A(十進制為42) 0XA0 (十進制為160) 0XFFFF (十進制為65535)

以下各數(shù)不是合法的十六進制整常數(shù):

5A (無前綴0X) 0X3H (含有非十六進制數(shù)碼)

十進制整常數(shù)十進制整常數(shù)沒有前綴。其數(shù)碼為0~9。

以下各數(shù)是合法的十進制整常數(shù):

237 -568 65535 1627

以下各數(shù)不是合法的十進制整常數(shù):

023 (不能有前導0) 23D (含有非十進制數(shù)碼)

在程序中是根據(jù)前綴來區(qū)分各種進制數(shù)的。因此在書寫常數(shù)時不要把前綴弄錯造成結果不正確。例如,數(shù)組int power_of_10[4]={0001,0010,0100,1000}的初值會被解釋為{1,8,64,1000}。

整型常數(shù)的后綴在16位字長的機器上,基本整型的長度也為16位,因此表示的數(shù)的范圍也是有限定的。十進制無符號整常數(shù)的范圍為0~65535,有符號數(shù)為-32768~+32767。八進制無符號數(shù)的表示范圍為0~0177777。十六進制無符號數(shù)的表示范圍為0X0~0XFFFF或0x0~0xFFFF。如果使用的數(shù)超過了上述范圍,就必須用長整型數(shù)來表示。長整型數(shù)是用后綴“L”或“l(fā)”來表示的。例如:1

十進制長整常數(shù) 158L (十進制為158) 358000L (十進制為-358000)

八進制長整常數(shù) 012L (十進制為10) 077L (十進制為63) 0200000L (十進制為65536)

十六進制長整常數(shù) 0X15L (十進制為21) 0XA5L (十進制為165) 0X10000L (十進制為65536)

長整數(shù)158L和基本整常數(shù)158在數(shù)值上并無區(qū)別。但對158L,因為是長整型量,C編譯系統(tǒng)將為它分配4個字節(jié)存儲空間。而對158,因為是基本整型,根據(jù)計算機的內部字長和編譯器的版本分配2或4個字節(jié)的存儲空間。因此在運算和輸出格式上要予以注意,避免出錯。對長整型都表示不了的大數(shù),某些編譯器規(guī)定可有64位整常數(shù)表示,后綴為“LL”或“l(fā)l”。有時,因為特殊需要,可能要對短整型進行特殊標記,只有部分編譯器支持短整型的后綴“S”或“s”。無符號數(shù)也可用后綴表示,整型常數(shù)的無符號數(shù)的后綴為“U”或“u”。例如:358u,0x38Au,235Lu均為無符號數(shù)。前綴,后綴可同時使用以表示各種類型的數(shù)。如0XA5Lu表示十六進制無符號長整數(shù)A5,其十進制為165。

整型變量整型變量可分為以下幾類:2

基本型類型說明符為int,根據(jù)計算機的內部字長和編譯器的版本,在內存中可能占2或4個字節(jié)(通常分別在16位機和32位機上),其取值為基本整常數(shù)。

短整型類型說明符為short int或short,在內存中占2個字節(jié),其取值為短整常數(shù)。

長整型類型說明符為long int或long,在內存中占4個字節(jié),其取值為長整常數(shù)。

4.64位整型(非ANSI標準)

類型說明符為__int64、long long int或long long,在內存中占8個字節(jié),其取值為64位整常數(shù)。

無符號型類型說明符為unsigned。它可以單獨使用代表unsigned int,也可以作為前綴,都表示無符號整數(shù),即永遠為非負的整型變量,大于0的數(shù)據(jù)范圍約擴大為原來的2倍。各種無符號類型量所占的內存空間字節(jié)數(shù)與相應的有符號類型量相同。但由于省去了符號位,故不能表示負數(shù)。下表列出了C++中各類整型量所分配的內存字節(jié)數(shù)及數(shù)的表示范圍。

對比

|| ||

整數(shù)溢出如果你指定一個數(shù)超出了 integer 的范圍,將會被解釋為 float。同樣如果你執(zhí)行的運算結果超出了 integer 范圍,也會返回 float?!疽訮HP語言為例】

PHP 中沒有整除的運算符。1/2 產(chǎn)生出浮點數(shù) 0.5。您可以總是舍棄小數(shù)部分,或者使用 round() 函數(shù)。

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

從布爾值轉換FALSE 將產(chǎn)生出0(零),TRUE 將產(chǎn)生出1(壹)。

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

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

注:在 Linux 下返回結果是最小負數(shù)(-214748),而在 Windows 下返回結果是零(0)。

【以下以C/C++語言為例,陳述一下整型的知識】:

a.C/C++對整型長度的規(guī)定是為了執(zhí)行效率,將int定義為機器字長可以取得最大的執(zhí)行速度;

b.C/C++中整型包括:int,char和enum,C++中還包含bool類型,C99中bool是一個宏,實際為_Bool;

c.C和C++對enum的規(guī)定有所不同,這里不描述;

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 的長度應當可以包容得下一個字符,大部分系統(tǒng)中就是一個字節(jié),而有的系統(tǒng)中可能是4個字節(jié),因為這些系統(tǒng)中一個字符需要四個字節(jié)來描述;

j.char 的正負取決于編譯器,而編譯器的決定取決于操作系統(tǒng),在不同的編譯器中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字節(jié)長,因為它的長度在不同的編譯器上并不相同。

本詞條內容貢獻者為:

閆曉東 - 副教授 - 中央民族大學信息工程學院