9 二進位制數 八進位制數和十六進製制數

2022-10-09 02:54:12 字數 2744 閱讀 8691

乙個數字預設就是十進位制的,表示乙個十進位制數字不需要任何特殊的格式。但是,表示乙個二進位制、八進位制或者十六進製制數字就不一樣了,為了和十進位制數字區分開來,必須採用某種特殊的寫法,具體來說,就是在數字前面加上特定的字元,也就是加字首。

1) 二進位制

二進位制由 0 和 1 兩個數字組成,使用時必須以0b0b(不區分大小寫)開頭,例如:

//合法的二進位制

int a = 0b101; //換算成十進位制為 5

int b = -0b110010; //換算成十進位制為 -50

int c = 0b100001; //換算成十進位制為 33

//非法的二進位制

int m = 101010; //無字首 0b,相當於十進位制

int n = 0b410; //4不是有效的二進位制數字

讀者請注意,標準的c語言並不支援上面的二進位制寫法,只是有些編譯器自己進行了擴充套件,才支援二進位制數字。換句話說,並不是所有的編譯器都支援二進位制數字,只有一部分編譯器支援,並且跟編譯器的版本有關係。

2) 八進位制

八進位制由 0~7 八個數字組成,使用時必須以0開頭(注意是數字 0,不是字母 o),例如:

//合法的八進位制數

int a = 015; //換算成十進位制為 13

int b = -0101; //換算成十進位制為 -65

int c = 0177777; //換算成十進位制為 65535

//非法的八進位制

int m = 256; //無字首 0,相當於十進位制

int n = 03a2; //a不是有效的八進位制數字

3) 十六進製制

十六進製制由數字 0~9、字母 a~f 或 a~f(不區分大小寫)組成,使用時必須以0x0x(不區分大小寫)開頭,例如:

//合法的十六進製制

int a = 0x2a; //換算成十進位制為 42

int b = -0xa0; //換算成十進位制為 -160

int c = 0xffff; //換算成十進位制為 65535

//非法的十六進製制

int m = 5a; //沒有字首 0x,是乙個無效數字

int n = 0x3h; //h不是有效的十六進製制數字

4) 十進位制

十進位制由 0~9 十個數字組成,沒有任何字首,和我們平時的書寫格式一樣,不再贅述。

c語言中常用的整數有 short、int 和 long 三種型別,通過 printf 函式,可以將它們以八進位制、十進位制和十六進製制的形式輸出。上節我們講解了如何以十進位制的形式輸出,這節我們重點講解如何以八進位制和十六進製制的形式輸出,下表列出了不同型別的整數、以不同進製的形式輸出時對應的格式控制符:

short

intlong

八進位制%ho

%o%lo

十進位制%hd

%d%ld

十六進製制

%hx 或者 %hx

%x 或者 %x

%lx 或者 %lx

十六進製制數字的表示用到了英文本母,有大小寫之分,要在格式控制符中體現出來:

八進位制數字和十進位制數字不區分大小寫,所以格式控制符都用小寫形式。如果你比較叛逆,想使用大寫形式,那麼行為是未定義的,請你慎重:

注意,雖然部分編譯器支援二進位制數字的表示,但是卻不能使用 printf 函式輸出二進位制,這一點比較遺憾。當然,通過轉換函式可以將其它進製數字轉換成二進位制數字,並以字串的形式儲存,然後在 printf 函式中使用%s輸出即可。考慮到讀者的基礎還不夠,這裡就先不講這種方法了。

【例項】以不同進製的形式輸出整數:

#include int main()

執行結果:

a=126, b=2713, c=7325603

a=86, b=1483, c=1944451

a=56, b=5cb, c=1dab83

a=56, b=5cb, c=1dab83

從這個例子可以發現,乙個數字不管以何種進製來表示,都能夠以任意進製的形式輸出。數字在記憶體中始終以二進位制的形式儲存,其它進製的數字在儲存前都必須轉換為二進位制形式;同理,乙個數字在輸出時要進行逆向的轉換,也就是從二進位制轉換為其他進製。

輸出時加上字首

請讀者注意觀察上面的例子,會發現有一點不完美,如果只看輸出結果:

區分不同進製數字的乙個簡單辦法就是,在輸出時帶上特定的字首。在格式控制符中加上#即可輸出字首,例如 %#x、%#o、%#lx、%#ho 等,請看下面的**:

#include int main()

執行結果:

a=0126, b=02713, c=07325603

a=86, b=1483, c=1944451

a=0x56, b=0x5cb, c=0x1dab83

a=0x56, b=0x5cb, c=0x1dab83

十進位制數字沒有字首,所以不用加#。如果你加上了,那麼它的行為是未定義的,有的編譯器支援十進位制加#,只不過輸出結果和沒有加#一樣,有的編譯器不支援加#,可能會報錯,也可能會導致奇怪的輸出;但是,大部分編譯器都能正常輸出,不至於當成一種錯誤。

二進位制 八進位制和十六進製制

我們平時使用的數字都是由 0 9 共十個數字組成的,例如 1 9 10 297 952 等,乙個數字最多能表示九,如果要表示 十 十一 二十 九 一百等,就需要多個數字組合起來。例如表示 5 8 的結果,乙個數字不夠,只能 進製 用 13 來表示 這時 進一位 相當於十,進兩位 相當於二十。因為逢十...

二進位制 八進位制和十六進製制

進製也就是進製。進行加法運算時逢 x進一 滿 x進一 進行減法運算時藉一當 x,這就是 x進製,這種進製也就包含 x個數字,基數為 x。十進位制有 0 9共 10個數字,基數為 10,在加減法運算中,逢十進一,借一當十。我們不妨將思維拓展一下,既然可以用 0 9共十個數字來表示數值,那麼也可以用0 ...

二進位制 八進位制 十六進製制

生活中我們普遍用十進位制,逢十進一。同理,二進位制八進位制和十六進製制是逢二進 一 逢八進 一 逢十六進一。十進位制是便於人理解而二進位制是便於電腦理解。二進位制在計算機內部使用是再自然不過的。但在人機交流上,二進位制有致命的弱點 數字的書寫特別冗長。二進位制和八進位制 二進位制和十六進製制之間的換...