C/C++のlong型は本当に必要?サイズが環境によって異なる理由を解説
CおよびC++には、整数値を扱うためのデータ型としてshort、int、long、long longの4種類が用意されています。それぞれが占めるメモリ領域のサイズは異なり、さらにそのサイズはアーキテクチャやOS、コンパイラによって変化するという特徴を持っています。例えば、int型は環境によって4バイトになる場合もあれば、2バイトになる場合もあります。
クロスコンパイラとは何か
こうしたサイズの違いを生む要因の一つが「クロスコンパイラ」の存在です。クロスコンパイラとは、現在実行中のプラットフォームとは別のプラットフォーム向けにコードをコンパイルできるコンパイラのことです。
そのため、まったく同じソースコードでも、32ビットシステムと64ビットシステムでコンパイルすると、出力結果が異なることがあります。
サンプルコードで確認してみよう
実際に、各整数型のサイズを出力する次のコードを実行して確認してみましょう。
#include <stdio.h>
int main(void) {
printf("int型のサイズ : %ld バイト\n", sizeof(int));
printf("long型のサイズ : %ld バイト\n", sizeof(long));
printf("long long型のサイズ : %ld バイト\n", sizeof(long long));
return 0;
}
出力結果(32ビット環境の場合)
int型のサイズ : 4 バイト long型のサイズ : 4 バイト long long型のサイズ : 8 バイト
出力結果(64ビット環境の場合)
int型のサイズ : 4 バイト long型のサイズ : 8 バイト long long型のサイズ : 8 バイト
この結果から分かるように、long型のサイズはコンパイラや実行環境によって異なります。では、なぜこのような違いが生じるのでしょうか。
long型のサイズが環境によって変わる理由
答えは、CPUがメモリからデータを読み込む仕組みにあります。CPUは、メモリアドレスレジスタ(MAR)にアドレスを指定することで、主記憶装置(RAM)からデータを呼び出します。目的の場所が見つかると、データはメモリバッファレジスタ(MBR)へ転送され、その後CPU内部のレジスタに格納されて利用されます。
データバスの幅がレジスタサイズを決める
ここで重要なのは、データバスの幅がCPUレジスタのサイズを決定するという点です。32ビットシステムでは、一度に読み込めるデータは4バイトまでです。もし32ビットを超えるデータを扱う場合は、2回のサイクルが必要になります。
つまり、それより小さいデータサイズであれば、処理速度に大きな差は生じません。しかし、64ビット環境では1サイクルで8バイトのデータを扱えるため、long型が8バイトに拡張されることで、より大きな整数値を効率よく処理できるようになります。これこそが、long型という「可変サイズの型」が存在する意義です。
補足:移植性を高めたい場合の対策
long型のサイズが環境依存であることは、移植性の面で注意が必要です。Windowsの64ビット環境(LLP64モデル)ではlong型は4バイトのままですが、LinuxやmacOSの64ビット環境(LP64モデル)では8バイトになります。
サイズを厳密に固定したい場合は、<stdint.h>(C99以降)で定義されているint32_t や int64_t などの固定幅整数型を使用するのが推奨されます。これにより、どのプラットフォームでも一貫した動作を保証できます。
-
C++のプリミティブデータ型(基本データ型)とは?6つの型をわかりやすく解説
プリミティブ型とはプリミティブ型(基本データ型)とは、表現できる値の性質が非常に単純なデータ型のことです。具体的には、数値・文字・真偽値といった基本的な値を扱います。プリミティブ型は、あらゆるプログラミング言語における最も基本的な構成要素であり、これらを組み合わせることで、配列や構造体などのより複雑なデータ型が作られています。C++を学ぶうえで、まず最初に押さえておきたい重要な概念です。C++の主なプリミティブデータ型C++には、以下の6種類のプリミティブデータ型が用意されています。番号型名説明1booltrueまたはfalseのいずれかの真偽値を格納します。2char通常は1オクテット(1バ
-
C++の変数とは?基本の変数宣言と主なデータ型をわかりやすく解説
変数(へんすう)とは、プログラムが操作できる「名前付きの記憶領域」のことです。C++では、各変数に必ず特定の「型」が割り当てられます。この型によって、次の3つの要素が決まります。変数のメモリ上のサイズと配置そのメモリに格納できる値の範囲その変数に適用できる演算(操作)の種類最もシンプルな変数の例を見てみましょう。int my_val = 5;この例では、int型(整数型)の変数 my_val を宣言し、値として 5 を代入しています。変数の宣言方法C++で変数を定義する一般的な書式は次のとおりです。type variable_name;宣言と同時に初期化したい場合は、以下のように記述します。t