C言語における8進リテラルの書き方と使い方
C/C++では、数値の先頭に0(ゼロ)を付けることで、8進数のリテラルを表現することができます。例えば、8進数の「25」をプログラム中で扱いたい場合は、「025」と記述します。
このように先頭に0を付けた整数リテラルは、コンパイラによって8進数として解釈されます。そのため、実際に格納される値は10進数に変換されたものになります。例えば、8進数の「25」は 2×8 + 5 = 21、8進数の「63」は 6×8 + 3 = 51 となります。
サンプルコード
#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
注意点
8進リテラルを使用する際には、以下の点に注意が必要です。
- 各桁で使用できる数字は 0〜7 のみです。「08」や「09」のように8や9を含めるとコンパイルエラーになります。
- 意図せず先頭に0を付けてしまうと、10進数のつもりでも8進数として解釈されるため、予期しないバグの原因になります。
なお、C++ではC++14以降、0o25 のように明示的に8進数であることを示すプレフィックスも利用できるようになっています。
-
C言語の複合リテラルとは?C99で導入された無名オブジェクトの生成方法を解説
C言語における複合リテラル(compound literal)は、C99規格で新たに導入された機能です。これを利用すると、名前を持たないオブジェクトを直接生成できます。通常、構造体などのオブジェクトを扱うには、あらかじめ変数を宣言しておく必要がありますが、複合リテラルを使えば宣言を省略し、その場で一時的なオブジェクトを作成して関数の引数などに渡すことが可能になります。 複合リテラルの基本構文 複合リテラルは、次のように「(型名){ 初期化子のリスト }」という形式で記述します。 (struct point) {10, 20} この式が評価されると、指定した型のオブジェクトが生成され、波括弧内の
-
C++で8進数を10進数に変換するプログラムの書き方
8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて