C语言中的整数
整數(shù)是編程中常用的一種數(shù)據(jù),C語(yǔ)言通常使用int來(lái)定義整數(shù)(int 是 integer 的簡(jiǎn)寫(xiě))。
現(xiàn)代操作系統(tǒng)中,int 一般占用 4 個(gè)字節(jié)(Byte)的內(nèi)存,共計(jì) 32 位(Bit)。如果不考慮正負(fù)數(shù),當(dāng)所有的位都為 1 時(shí)它的值最大,為 232-1 = 4,294,967,295 ≈ 43億,這是一個(gè)很大的數(shù),實(shí)際開(kāi)發(fā)中很少用到,而諸如 1、99、12098 等較小的數(shù)使用頻率反而較高。
使用 4 個(gè)字節(jié)保存較小的整數(shù)綽綽有余,會(huì)空閑出兩三個(gè)字節(jié)來(lái),這些字節(jié)就白白浪費(fèi)掉了,不能再被其他數(shù)據(jù)使用。
我們要讓整數(shù)占用更多的內(nèi)存,用來(lái)表示更大的值,比如占用 6 個(gè)字節(jié)或者 8 個(gè)字節(jié)。
讓整數(shù)占用更少的內(nèi)存可以在 int 前邊加 short,讓整數(shù)占用更多的內(nèi)存可以在 int 前邊加 long。
示例
short int a = 10; short int b, c = 99; long int m = 12123; long int n, p = 562131;這樣 a、b、c 只占用 2 個(gè)字節(jié)的內(nèi)存,而 m、n、p 可能會(huì)占用 8 個(gè)字節(jié)的內(nèi)存。
我們也可以將 int 省略,只寫(xiě) short 和 long,如下所示:
short a = 10; short b, c = 99; long m = 102023; long n, p = 562131;這樣的寫(xiě)法更加簡(jiǎn)潔高效。
int 是基本的整數(shù)類(lèi)型,short 和 long 是在 int 的基礎(chǔ)上進(jìn)行的擴(kuò)展,short 可以節(jié)省內(nèi)存,long 可以容納更大的值。
short、int、long 是C語(yǔ)言中常見(jiàn)的整數(shù)類(lèi)型,其中 int 稱(chēng)為整型,short 稱(chēng)為短整型,long 稱(chēng)為長(zhǎng)整型。
整型的長(zhǎng)度
我們?cè)诿枋鰏hort、int、long 類(lèi)型的長(zhǎng)度時(shí),只對(duì) short 使用肯定的說(shuō)法,而對(duì) int、long 使用了“一般”或者“可能”等不確定的說(shuō)法。這種描述的言外之意是,只有 short 的長(zhǎng)度是確定的,是兩個(gè)字節(jié),而 int 和 long 的長(zhǎng)度無(wú)法確定,在不同的環(huán)境下有不同的表現(xiàn)。
一種數(shù)據(jù)類(lèi)型占用的字節(jié)數(shù),稱(chēng)為該數(shù)據(jù)類(lèi)型的長(zhǎng)度。例如,short 占用 2 個(gè)字節(jié)的內(nèi)存,那么它的長(zhǎng)度就是 2。
C語(yǔ)言并沒(méi)有嚴(yán)格規(guī)定 short、int、long 的長(zhǎng)度,只做了寬泛的限制:
short 至少占用 2 個(gè)字節(jié)。int 建議為一個(gè)機(jī)器字長(zhǎng)。32 位環(huán)境下機(jī)器字長(zhǎng)為 4 字節(jié),64 位環(huán)境下機(jī)器字長(zhǎng)為 8 字節(jié)。short 的長(zhǎng)度不能大于 int,long 的長(zhǎng)度不能小于 int。它們的長(zhǎng)度(所占字節(jié)數(shù))關(guān)系為:
2 ≤ short ≤ int ≤ longshort 并不一定真的”短“,long 也并不一定真的”長(zhǎng)“,它們有可能和 int 占用相同的字節(jié)數(shù)。
在 16 位環(huán)境下,short 的長(zhǎng)度為 2 個(gè)字節(jié),int 也為 2 個(gè)字節(jié),long 為 4 個(gè)字節(jié)。
對(duì)于 32 位的 Windows、Linux 和 Mac OS,short 的長(zhǎng)度為 2 個(gè)字節(jié),int 為 4 個(gè)字節(jié),long 也為 4 個(gè)字節(jié)。
在 64 位環(huán)境下,不同的操作系統(tǒng)會(huì)有不同的結(jié)果,如下圖所示:
在PC系統(tǒng)為 Win XP、Win 7、Win 8、Win 10、Mac OS、Linux,中,short 和 int 的長(zhǎng)度都是固定的,分別為 2 和 4,大家可以放心使用,只有 long 的長(zhǎng)度在 Win64 和類(lèi) Unix 系統(tǒng)下會(huì)有所不同,使用時(shí)要注意移植性。
sizeof 操作符
獲取某個(gè)數(shù)據(jù)類(lèi)型的長(zhǎng)度可以使用 sizeof 操作符。
示例
#include <stdio.h> int main() {short a = 10;int b = 100;int short_length = sizeof a;int int_length = sizeof(b);int long_length = sizeof(long);int char_length = sizeof(char);printf("short=%d, int=%d, long=%d, char=%d\n", short_length, int_length, long_length, char_length);return 0; }在 32 位環(huán)境以及 Win64 環(huán)境下的運(yùn)行結(jié)果為:
short=2, int=4, long=4, char=1在 64 位 Linux 和 Mac OS 下的運(yùn)行結(jié)果為:
short=2, int=4, long=8, char=1sizeof 用來(lái)獲取某個(gè)數(shù)據(jù)類(lèi)型或變量所占用的字節(jié)數(shù),如果后面跟的是變量名稱(chēng),那么可以省略( ),如果跟的是數(shù)據(jù)類(lèi)型,就必須帶上( )。
注意: sizeof 是C語(yǔ)言中的操作符,不是函數(shù),所以可以不帶( )。
使用不同的格式控制符可以輸出不同類(lèi)型的整數(shù)
%hd用來(lái)輸出 short int 類(lèi)型,hd 是 short decimal 的簡(jiǎn)寫(xiě);%d用來(lái)輸出 int 類(lèi)型,d 是 decimal 的簡(jiǎn)寫(xiě);%ld用來(lái)輸出 long int 類(lèi)型,ld 是 long decimal 的簡(jiǎn)寫(xiě)。不同整型的輸出:
#include <stdio.h> int main() {short a = 10;int b = 99;long c = 9437;printf("a=%hd, b=%d, c=%ld\n", a, b, c);return 0; }運(yùn)行結(jié)果:
a=10, b=99, c=9437注意:要將格式控制符和數(shù)據(jù)類(lèi)型嚴(yán)格對(duì)應(yīng)起來(lái),養(yǎng)成良好的編程習(xí)慣。當(dāng)然,如果你不嚴(yán)格對(duì)應(yīng),一般也不會(huì)導(dǎo)致錯(cuò)誤。
使用%d輸出所有的整數(shù)類(lèi)型
#include <stdio.h> int main() {short a = 10;int b = 99;long c = 9437;printf("a=%d, b=%d, c=%d\n", a, b, c);return 0; }運(yùn)行結(jié)果仍然是:
a=10, b=99, c=9437當(dāng)使用%d輸出 short,或者使用%ld輸出 short、int 時(shí),不管值有多大,都不會(huì)發(fā)生錯(cuò)誤,因?yàn)楦袷娇刂品銐蛉菁{這些值。
當(dāng)使用%hd輸出 int、long,或者使用%d輸出 long 時(shí),如果要輸出的值比較小(如上所示情況),一般也不會(huì)發(fā)生錯(cuò)誤,如果要輸出的值比較大,就很有可能發(fā)生錯(cuò)誤,例如:
#include <stdio.h> int main() {int m = 306587;long n = 28166459852;printf("m=%hd, n=%hd\n", m, n);printf("n=%d\n", n);return 0; }在 64 位 Linux 和 Mac OS 下(long 的長(zhǎng)度為 8)的運(yùn)行結(jié)果為:
m=-21093, n=4556 n=-1898311220輸出結(jié)果錯(cuò)誤,這是因?yàn)?hd容納不下 m 和 n 的值,%d也容納不下 n 的值。
我們?cè)诰帉?xiě)程序的時(shí)候要特別注意,當(dāng)格式控制符和數(shù)據(jù)類(lèi)型不匹配時(shí),編譯器會(huì)給出警告,提示程序可能會(huì)存在風(fēng)險(xiǎn)。
編譯器的警告是分等級(jí)的,不同程度的風(fēng)險(xiǎn)被劃分成了不同的警告等級(jí),而使用%d輸出 short 和 long 類(lèi)型的風(fēng)險(xiǎn)較低,如果你的編譯器設(shè)置只對(duì)較高風(fēng)險(xiǎn)的操作發(fā)出警告,那么此處你就看不到警告信息。
如果感覺(jué)不錯(cuò)的話(huà)請(qǐng)點(diǎn)贊!!!
總結(jié)
- 上一篇: C++ static静态成员函数
- 下一篇: pycharm创建我的第一个项目