数値の先頭にある0(ゼロ)とは?C++における8進リテラルの意味と使い方
C/C++において、数値の先頭に付く「0(ゼロ)」は、その数が8進リテラル(octal literal)であることを示します。これは多くの初心者が見落としがちな重要な仕様です。
8進数リテラルを使うには、実際の数値の前にゼロを付けて記述します。例えば、8進数の「25」を表したい場合は「025」と書き、8進数の「63」であれば「063」と記述します。コンパイラは先頭にゼロが付いた整数を10進数ではなく8進数として解釈します。
サンプルコード
#include <stdio.h>
int main() {
int a = 025;
int b = 063;
printf("Decimal of 25(Octal) is %d\n", a);
printf("Decimal of 63(Octal) is %d\n", b);
}実行結果
Decimal of 25(Octal) is 21 Decimal of 63(Octal) is 51
結果の解説
このプログラムでは、025(8進数の25)は10進数に変換すると「21」、063(8進数の63)は「51」と出力されます。計算方法は次の通りです。
- 025 → 21: 2×8 + 5×1 = 16 + 5 = 21
- 063 → 51: 6×8 + 3×1 = 48 + 3 = 51
注意点
普段は10進数で数値を書いている場合でも、うっかり先頭にゼロを付けてしまうと、コンパイラによって8進数として解釈され、意図しない値になってしまいます。特に日付や時刻、電話番号のような「0」で始まる数字を扱う際には注意が必要です。
なお、C++では接頭辞によって基数が決まります。0xを付けると16進数、C++14以降では0bを付けると2進数として記述できます。基数を明確にしたい場面では、これらの接頭辞を正しく使い分けましょう。
-
C++におけるゼロ初期化とは?構文・適用条件・サンプルコードを解説
ゼロ初期化(Zero initialization)とは、C++においてオブジェクトの初期値をゼロに設定することを指します。明示的な初期化子が与えられなかった場合でも、変数が予測可能な状態で始まることを保証する重要な仕組みです。 構文 T{}; char array[n] = ; 波括弧 {} を用いた初期化や、空文字列による文字配列の初期化が、ゼロ初期化に該当します。 ゼロ初期化が行われる主なケース 静的記憶域期間(static)またはスレッドローカル記憶域期間(thread_local)を持つ名前付き変数が、プログラム起動時にゼロで初期化される場合。 クラス型ではない基本的な型(int、
-
C++で8進数を10進数に変換するプログラムの書き方
8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて