十六進制數後跟L/U/UL解析

C語言支持兩種不同的數值類型,整數類型(也稱整型),浮點類型(也稱浮點型)。整數類型的值是整數,而浮點類型的值則可能還有小數部分。

整數類型分類

整數類型又分爲兩大類:有符號型和無符號型。

有符號整數如果爲正數或零,那麼最左邊的位(符號位)爲0;如果爲負數,則符號位爲1。因此,最大的16位整數的二進制表示形式是0111 1111 1111 1111,對應的值是32767(即2^15-1)。而最大的32位整數是0111 1111 1111 1111 1111 1111 1111 1111,對應的數值是2147483647(即2^31-1)。

不帶符號位的整數(最左邊的位是數值的一部分)的整數稱爲無符號整數。最大的16位無符號整數是65535(即2^16-1),而最大的32位無符號整數是4294967295(即2^32-1)。

默認情況下,C語言中的整型變量都是有符號的,也就是說最左位保留爲符號位。若要告訴編譯器變量沒有符號位,需要把它聲明成unsigned類型。無符號整數主要用於系統編程和底層與機器相關的應用。

C語言還提供了四個可以修飾int的關鍵字:short、long、signed,以及unsigned。利用這四個關鍵字,C語言標準定義了以下整數類型:

1) short int(可簡寫爲 short)

2) int

3) long int(簡寫:long)

4) long long int(簡寫:long long)

5) unsigned short int(簡寫:unsigned short)

6) unsigned int

7) unsigned long int(簡寫:unsigned long)

8) unsigned long long int(簡寫:unsigned long long)

有沒有signed都表示有符號整數,例如:signed int等同於int。

一般我們把short稱爲短整型,把long稱爲長整型,把long long稱爲超長整型,把int稱爲整型。unsigned打頭的那些整數類型統稱爲無符號整型。例如:我們稱unsigned short爲無符號短整型,以此類推。

整型數據的長度

C語言只規定short <= int <=long int。具體還得看具體的編譯器,long int型並不能肯定就是64位的,很多時候long int和int表示的範圍是一致的。

在16位操作系統(例如DOS)中,一般用2字節存放一個int型數據;在32位操作系統(例如Windows98)中,默認爲4字節。各類整型數據的長度及讀寫格式見下表:

整數常量

常量是在程序中以文本形式出現的數,而不是讀、寫或計算出來的數。C語言允許用十進制(基數爲10)、八進制(基數爲8)和十六進制(基數爲16)形式書寫整數常量。

八進制數是用數字0~7書寫的。八進制數的每一位表示一個8的冪(這就如同十進制數的每一位表示10的冪一樣)。因此,八進制的數237表示成十進制數就是2x8^2+3x8^1+7x8^0=128+24+7=159。

十六進制數是用數字0~9加上字母A~F書寫的,其中字母A~F表示10~15的數。十六進制數的每一位表示一個16的冪,十六進制數1AF的十進制數值是1x16^2+10x16^1+15x16^0=256+160+15=431。

十進制常量包含0~9中的數字,但是一定不能以零開頭:15 255 32767

八進制常量只包含0~7中的數字,而且必須要以零開頭:017 0377 077777

十六進制常量包含0~9中的數字和a~f中的字母,而且總是以0x開頭:0xf 0xff 0x7fff

十六進制常量中的字母既可以是大寫字母也可以是小寫字母:0xf 0xFF 0x7fFF

八進制和十六進制只是書寫數的方式,它們不會對數的實際存儲方式產生影響。整數都是以二進制形式存儲的,跟表示方式無關。任何時候都可以從一種書寫方式切換到另一種書寫方式,甚至可以混合使用:10+015+0x20的值爲55(十進制)。

十進制整數常量的類型通常爲int,但如果常量的值大得無法存儲在int型中,就用long int類型。如果出現long int不夠用的情況,則用unsigned long int作最後的嘗試。確定八進制和十六進制常量的規則時,編譯器會依次嘗試int、unsigned int、long int和unsigned long int類型,直到找到能表示該常量的類型。

C99確定整數常量類型的規則與C89有些不同。對於沒有後綴(U、u、L、l、LL、ll)的十進制常量,其類型是int、long int或long long int中能表示該值的“最小”類型。對於八進制或者十六進制常量,可能的類型順序爲int、unsigned int、long int、unsigned long int、long long int和unsigned long long int。常量後面的任何後綴都會改變可能類型的列表。例如,以U(或u)結尾的常量類型一定是unsigned int、unsigned long int和unsigned long long int中的一種。

爲了強制編譯器把常量作爲長整數來處理,只需在後邊加上一個字母L(或l):

15L 0377L 0x7fffL

爲了指明是無符號常量,可以在常量後邊加上字母U(或u):

15U 0377U 0x7fffU

L和U可以結合使用,以表明常量既是長整型又是無符號的:0xffffffffUL。(字母L、U的順序和大小寫無所謂。)

在C99中,以LL或ll(兩個字母大小寫要一致)結尾的整數常量是long long int型的。如果在LL或ll的前面或後面增加字母U(或u),則該整數常量爲unsigned long long int型。

整數溢出

對整數執行算數運算時,其結果有可能因爲太大而無法表示。例如,對兩個int值進行算術運算時,結果必須仍然能用int類型來表示;否則(表示結果所需的數位太多)就會發生溢出。

整數溢出時的行爲要根據操作數是有符號型還是無符號型來確定。有符號整數運算中發生溢出時,程序的行爲是未定義的,未定義行爲的結果是不確定的。最可能的情況是,僅僅是運算的結果出錯了,但程序也有可能崩潰,或出現其他意想不到的情況。

無符號整數運算過程中發生溢出時,結果是有定義的:正確答案對2^n取模,其中n是用於存儲結果的位數,例如,如果對無符號的16位數65535加1,其結果可以保證爲0。

整數讀/寫

讀寫無符號整數、短整數和長整數需要轉換說明符。

讀寫無符號整數時,使用字母u、o或x代替轉換說明中的d。如果使用u說明符,該數將以十進制形式讀寫,o表示八進制形式,而x表示十六進制形式。


unsigned int u;

scanf("%u", &u);  /* reads u in base 10 */
printf("%u", u);  /* writes u in base 10 */
scanf("%o", &u);  /* reads u in base 8 */
printf("%o", u);  /* writes u in base 8 */
scanf("%x", &u);  /* reads u in base 16 */
printf("%x", u);  /* writes u in base 16 */

讀寫短整數時,在d、o、u或x前面加上字母h:


short s;

scanf("%hd", &s);
printf("%hd", s); 

讀寫長整數時,在d、o、u或x前面加上字母l:


short l;

scanf("%ld", &l);
printf("%ld", l); 

讀寫長長整數時(僅限C99),在d、o、u或x前面加上字母ll:


short ll;

scanf("%lld", &ll);
printf("%lld", ll); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章