C言語でintに複数の文字を代入すると?マルチキャラクタ定数の動作を解説
C言語やC++では、char型のデータは内部的にASCIIコードの数値として格納されています。そのため、1文字を整数(%d)として出力すると、対応するASCIIコードが表示されます。
ところが、シングルクォートの中に複数の文字を記述して出力しようとすると、一見すると奇妙な大きな数値が表示されることがあります。これは「マルチキャラクタ定数」と呼ばれる挙動によるものです。以下のプログラムでその様子を確認してみましょう。
サンプルプログラム
#include <stdio.h>
int main() {
printf("%d\n", 'A');
printf("%d\n", 'AA');
printf("%d\n", 'ABC');
}実行結果
65 16705 4276803
なぜこのような結果になるのか?
まず、'A' のASCIIコードは 65(2進数で 01000001)です。そのため、最初の出力は素直に 65 となります。
次に 'AA' の場合は、2文字分のASCIIコードが連結された値として扱われます。つまり 01000001 01000001(16進数で 0x4141)というビット列になり、10進数に変換すると 16705 となります。
同様に 'ABC' の場合は、3文字分のASCIIコード 01000001 01000010 01000011(16進数で 0x414243)がひとつの整数として解釈され、4276803 という値になります。
注意点:処理系依存の動作
このような複数文字の定数は、C言語の標準規格では「処理系定義(implementation-defined)」とされており、コンパイラや環境によって値や扱いが異なる場合があります。移植性を重視するプログラムでは、複数文字をシングルクォートで囲む書き方は避け、文字列としてダブルクォートで表現するか、配列やポインタを使って扱うのが安全です。
-
構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説
ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型
-
C言語におけるユニオンとポインタの使い方を徹底解説
ユニオン(共用体)とは、異なるデータ型を持つ複数の変数が、同一のメモリ領域を共有するための仕組みです。構造体が各メンバーごとに独立したメモリを割り当てるのに対し、ユニオンではすべてのメンバーが同じアドレスを参照するという点が大きな特徴です。 ユニオンの構文 ユニオンを定義するときの基本的な書式は次の通りです。 union タグ名{ データ型 メンバー1; データ型 メンバー2; ---- ---- データ型 メンバーn; }; 実際の記述例を見てみましょう。 union sample{ int a; float b; char