C/C++で数値定数の先頭に「0」が付くのはどういう意味?8進数リテラルの基本を解説
CやC++のソースコードを見ていると、数値リテラルの先頭に「0」が付いているケースに遭遇することがあります。実はこれ、単なる装飾ではなくその数値が8進数(octal number)であることを示す記法です。
つまり、8進数リテラルは必ず先頭に0を付けます。例えば、8進数の「25」を表したい場合は、コード中では「025」と記述します。
サンプルコード
以下の例では、8進数リテラル「025」と「063」をint型変数に代入し、printf関数で10進数として出力しています。
#include <stdio.h>
int main() {
int a = 025; // 8進数の25
int b = 063; // 8進数の63
printf("Decimal of 25(Octal) is %d\n", a);
printf("Decimal of 63(Octal) is %d\n", b);
return 0;
}
実行結果
Decimal of 25(Octal) is 21 Decimal of 63(Octal) is 51
解説:なぜ10進数に変換されるのか
8進数の「25」は、各桁を8の累乗で計算すると次のようになります。
- 025(8進数) → 2×8 + 5×1 = 21(10進数)
- 063(8進数) → 6×8 + 3×1 = 51(10進数)
%d指定子は値を10進数として表示するため、上記のような結果になります。
注意点
先頭に0を付ける記法は意図せずバグを生む原因にもなります。例えば、見た目が10進数のように思える「010」は、実際には8進数として解釈され10進数の8になります。また、8進数で使用できる数字は0〜7のみのため、「08」や「09」のように8や9を含めるとコンパイルエラーとなります。
なお、C++14以降では可読性を高めるために「0o25」のような0oプレフィックスを使う方法も検討されてきましたが、現行の標準C/C++では引き続き先頭の「0」が8進数リテラルの正式な記法となっています。ファイルパーミッション(chmodなど)を扱う場面では今でも頻繁に使われるため、覚えておくと役立ちます。
-
LTEとは?意味や特徴、4G・5Gとの違いをわかりやすく解説
LTEとは?基本的な意味LTE(Long Term Evolution)は、WiMAXや3Gといった従来の技術に代わる4G無線ブロードバンド規格です。3Gより高速ですが、真の4Gや現行の最新規格である5Gと比べると速度は劣ります。LTEは、スマートフォンやタブレットなどのモバイルデバイスが、Wi-Fi接続の代わりに利用する技術です。3Gや4Gと同様に、モバイルデバイスが基地局を経由してインターネットに接続する仕組みを定めた技術標準となっています。実は「LTE」は、4Gへの進化を示すためのマーケティング用語としての側面が強い言葉です。LTEや4Gに該当するかどうかを裁定する国際的な規制機関は存在
-
テレビ・モニター選びで必須の知識!「解像度」とは何か?意味と選び方を徹底解説
新しいスクリーンの購入はワクワクするものですが、専門用語だらけのスペックシートを目にすると、戸惑ってしまうこともあるでしょう。視聴体験を大きく左右する最重要スペックのひとつが、画面の「解像度」です。 Windowsのディスプレイ設定を触ったことがある人なら、「解像度」という言葉を見かけたことがあるはずです。HDTVをPCモニターとして使う際にオーバースキャン問題が起きたときや、表示品質を改善したいときに、解像度の変更で対処できることもあります。では、解像度とは一体何を意味するのでしょうか? 画面の解像度とは? 解像度とは、画面が表示する画像の鮮明さを表す指標です。この用語は、テレビ・モニター