- 對於八進制數字,它沒法和十進制、十六進制區分,因爲八進制、十進制和十六進制都包含 0~7 這幾個數字。
- 對於十進制數字,它沒法和十六進制區分,因爲十六進制也包含 0~9 這幾個數字。如果十進制數字中還不包含 8 和 9,那麼也不能和八進制區分了。
- 對於十六進制數字,如果沒有包含 a~f 或者 A~F,那麼就無法和十進制區分,如果還不包含 8 和 9,那麼也不能和八進制區分了。
區分不同進制數字的一個簡單辦法就是,在輸出時帶上特定的前綴。在格式控制符中加上#
即可輸出前綴,例如 %#x、%#o、%#lX、%#ho 等,請看下面的代碼:
#include <stdio.h>
int main()
{
short a = 0b1010110; //二進制數字
int b = 02713; //八進制數字
long c = 0X1DAB83; //十六進制數字
printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c); //以八進制形似輸出
printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十進制形式輸出
printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c); //以十六進制形式輸出(字母小寫)
printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c); //以十六進制形式輸出(字母大寫)
return 0;
}
運行結果:
a=0126, b=02713, c=07325603
a=86, b=1483, c=1944451
a=0x56, b=0x5cb, c=0x1dab83
a=0X56, b=0X5CB, c=0X1DAB83
十進制數字沒有前綴,所以不用加#
。如果你加上了,那麼它的行爲是未定義的,有的編譯器支持十進制加#
,只不過輸出結果和沒有加#
一樣,有的編譯器不支持加#
,可能會報錯,也可能會導致奇怪的輸出;但是,大部分編譯器都能正常輸出,不至於當成一種錯誤。