わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

0から始まる整数は8進数

「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』なのですけどね」

*1:JIS X 3010:2003の6.4.4.1(整数定数)の構文規則で,0単独は8進定数になるとされています.10進定数は「非0数字」か「10進定数 数字」のいずれかです.浮動小数点定数の構文規則には,「数字列」や,「10進」「16進」から始まるものを見かけますが,「8進」から始まるものはありません.その規則から,そして実際にコードを書いてみても分かりますが,「double d = 0123;」と「double d = 0123.0;」では,変数dに入る値が異なります.