「int型の変数aに対して,
a = 123;
と,
a = 0123;
は,別の意味となります.前者は文字どおり,123(ひゃくにじゅうさん)を変数に代入しますが,後者の0123(ぜろいちにいさん)について,これは8進数を表します.8進数の123(いちにいさん)となる数値を,変数に代入します.そこで
printf("a = %d\n", a);
を実行すると,『%d』のおかげで,aの数値を10進数で出力することになり,これは『a = 83』となります.8進数で,出力したければ,
printf("a = 0%o\n", a);
と『%o』を使います.なお,dはdecimal,oはoctalの頭文字と理解しておきましょう.decimalは『10進数の』,octalは『8進数の』という意味の形容詞です.
8進数は,Cのプログラミングで,よく使うというものでもありません.1バイト=8ビットが当たり前の我々の計算機環境では,0xで始まる16進数で表記するほうが多いですし,整数をビットの並びと見る場合には,それに適した定数の表記があります.128を『1 << 7』と書くのは,第4回のサンプルプログラムで登場予定です.
ですがLinuxを含むUnix文化では,8進数の使いどころが一つ,あります.ファイルなどのパーミッションです.644というパーミッションだと,まず自分は読みができる,書きもできる,実行はできない,と解釈することになります.できる・できる・できないを1・1・0と3ビットで表した上で,110の8進表現は6です.同じグループの他のユーザは読みができる,書きはできない,実行もできない,なので100となりますが,これは8進数で4です.他のグループのユーザも同じです.
それから,『0』だけという表記も,Cの規格上は,8進数となります.暇な人は,JIS X 3010という文書を調べてみてください*1.
といっても,10進数のゼロも,8進数のゼロも,我々にしてみたらおんなじ『0』なのですけどね」