C言語のlong long型とは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


C言語のlong long型とは

long long型はC言語で使用される整数型の一つであり、非常に大きな整数値を格納することができるデータ型です。通常のint型やlong型では表現できない範囲の整数値を扱う必要がある場合に使用されます。

long long型は、C99規格で導入された比較的新しいデータ型であり、多くの処理系で64ビット(8バイト)の大きさを持っています。これにより、約-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの整数値を表現できます。

変数宣言は「long long 変数名;」のように行います。また、long long型の定数を表す際は、数値の末尾にLL(または ll)を付けます(例: 1234567890LL)。サフィックスを付けることで、コンパイラにその数値がlong long型であることを明示できるのです。

long long型を使用する際は、メモリ使用量が大きくなることに注意が必要です。また、処理系によってはlong long型をサポートしていない場合もあるため、移植性を考慮する必要があります。

通常のint型やlong型で十分な範囲の整数値しか扱わない場合は、アプリケーションの移植性や効率性の観点から、long long型の使用は避けるべきでしょう。しかし、非常に大きな整数値を扱う必要がある場合は、long long型が有効な選択肢となります。

long long型の値の範囲と格納サイズ

long long型が扱える整数値の範囲と格納サイズについて、以下3つを簡単に解説していきます。

  • long long型が扱える整数値の範囲
  • long long型が必要とするメモリサイズ
  • 他の整数型との値の範囲の比較

long long型が扱える整数値の範囲

C99規格では、long long型は少なくとも64ビットの大きさを持つことが規定されています。つまり、long long型は少なくとも-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの整数値を表現できます。

ただし、処理系によってはlong long型がサポートする値の範囲が異なる場合があります。例えば、64ビットを超える環境では、より広い範囲の整数値を扱えるようにlong long型の大きさが拡張されていることもあるのです。

long long型が必要とするメモリサイズ

一般的に、long long型は64ビット(8バイト)のメモリサイズを必要とします。この大きさは、long long型が扱える値の範囲を表現するために十分なビット数だからです。

しかし、前述の通り処理系によってはlong long型の大きさが64ビットより大きくなる場合があります。メモリ使用量を最小限に抑えたい場合は、アプリケーションの要件に応じて適切なデータ型を選択する必要があるでしょう。

他の整数型との値の範囲の比較

long long型と他の整数型(int型やlong型など)の値の範囲を比較すると、long long型が扱える整数値の範囲が非常に広いことがわかります。int型やlong型の値の範囲は処理系に依存しますが、通常はlong long型より狭くなっています。

例えば、多くの32ビット処理系ではint型は-2,147,483,648から2,147,483,647までの範囲の整数値しか扱えません。long型も同様の範囲か、若干広い程度です。これに対し、long long型は約922京(約922兆の1万倍)もの広い範囲をカバーしているのです。

long long型の使用例

実際のプログラミングにおけるlong long型の使用例について、以下3つを簡単に解説していきます。

  • 非常に大きな整数値を扱う計算
  • ファイルオフセットの指定
  • 暗号化や乱数生成における大きな数値の使用

非常に大きな整数値を扱う計算

科学計算や金融計算など、非常に大きな整数値を扱う必要がある場合にlong long型が使用されます。例えば、非常に大きな数値の階乗を計算するプログラムでは、long long型を使用することで正確な結果を得ることができるでしょう。

ただし、long long型を使用しても扱える値の範囲は有限です。さらに大きな整数値を扱う必要がある場合は、任意精度演算ライブラリを使用するなどの対応が必要になります。

ファイルオフセットの指定

ファイル入出力において、ファイルの特定の位置にアクセスするためにオフセット値を指定する場合があります。特に、大きなファイルを扱う際には、オフセット値が32ビットでは表現できない範囲になることがあります。

このような場合、long long型を使用してオフセット値を指定することで、ファイルの任意の位置にアクセスできます。fseek関数やftell関数など、ファイル操作関数の引数としてlong long型が使用されることがあるのはこのためです。

暗号化や乱数生成における大きな数値の使用

暗号化アルゴリズムや乱数生成アルゴリズムの中には、非常に大きな整数値を使用するものがあります。これらのアルゴリズムを実装する際には、long long型を使用して大きな整数値を表現することが一般的です。

例えば、RSA暗号では非常に大きな素数を使用します。また、暗号論的に安全な乱数生成器の中には、64ビット以上の内部状態を持つものがあります。これらのアルゴリズムをC言語で実装する際には、long long型が重要な役割を果たすのです。

long long型の注意点とその対策

long long型を使用する際の注意点とその対策について、以下3つを簡単に解説していきます。

  • 移植性の問題と対処法
  • メモリ使用量への影響の考慮
  • 書式指定子と入出力関数の使い方

移植性の問題と対処法

C99規格ではlong long型が導入されましたが、一部の古い処理系ではlong long型をサポートしていない場合があります。そのため、long long型を使用するプログラムの移植性には注意が必要です。

移植性を確保するためには、コンパイラが__STDC_VERSION__マクロをチェックすることで、C99に対応しているかどうかを判断できます。また、long long型が使用可能かどうかを事前に確認するために、LLONG_MAXLLONG_MINマクロの存在をチェックすることもできるでしょう。

#ifdef __STDC_VERSION__
#if __STDC_VERSION__ >= 199901L
/* C99に対応している場合の処理 */
#else
/* C99に対応していない場合の処理 */
#endif
#endif

メモリ使用量への影響の考慮

long long型は64ビット(8バイト)の大きさを持つため、メモリ使用量がint型やlong型に比べて大きくなります。大量のlong long型変数を使用する場合は、メモリ使用量への影響を考慮する必要があります。

アプリケーションの要件に応じて、本当にlong long型が必要かどうかを検討しましょう。また、不要になったlong long型変数は早めに解放するなど、メモリ管理にも気を配る必要があります。

書式指定子と入出力関数の使い方

long long型の値を入出力する際は、適切な書式指定子を使用する必要があります。scanf関数やprintf関数での書式指定子は、%lld(long long型の10進数)や%llx(long long型の16進数)などを使用します。

また、long long型の値を文字列に変換する際はsprintf関数、文字列からlong long型の値に変換する際はatoll関数やstrtoll関数を使用します。これらの関数を使用することで、long long型の値を適切に入出力できます。

long long value = 1234567890LL;
printf("value = %lld
", value);

char str[32];
sprintf(str, "%lld", value);
printf("str = %s
", str);

※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「プログラミング」に関するコラム一覧「プログラミング」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。