最終更新日時:
が更新

履歴 編集

long long型(C++11)

概要

C99互換として、long long整数型が追加された。

この整数型は、64ビット以上の値を表現できる。

仕様

  • long long型およびunsigned long long型は、64ビット以上の値を表現できることが保証される。
    • これは、long long型の最大値を表現するマクロLLONG_MAX、およびunsigned long long型の最大値を表現するマクロULLONG_MAXによって定義されている。
  • 符号あり整数型であるlong longを表す整数リテラルには、llもしくはLLサフィックスを使用する。符号なし整数型であるunsigned long long型を表す整数リテラルには、ullもしくはULLサフィックスを使用する。
    • 符号指定を除くllLLの部分では、大文字と小文字の混在は許可しない。(lLLlは許可されないが、'uLL'や'Ull'は問題ない。)
  • long longは、以下のようにも表記できる:
    • signed long long
    • signed long long int
    • long long int
  • unsigned long longは、unsigned long long intのようにも表記できる。

備考

long long型の追加にともなって、ライブラリにも以下のような変更が入った:

  • fprintf()fscanf()およびそのフォーマットを使用する関数に、long longを表すllが表現幅を指示するために追加された。
  • #ifおよび#elifに指定する定数条件式の評価について、「(unsigned) int(unsigned) longと同じ表現(範囲)を持つように振舞う」とされていたのが、「全ての符号付きまたは符号無し整数型はそれぞれintmax_tまたはuintmax_tの表現(範囲)を持つように振舞う」と変更された。
  • その他、入出力や数学の関数にも、long long型のサポートが追加された。

long longは64ビット以上の幅であることが保証されるが、64ビット固定の整数型が必要な場合には、int64_t型を使用することを推奨する。たとえばシリアライズの際には、ビット幅が固定の整数型を使用すれば、異なるプラットフォームでもデシリアライズできる。

#include <iostream>

int main()
{
  long long x = 123LL;
  std::cout << x << std::endl;
}

出力

123

この機能が必要になった背景・経緯

この型は、64ビットCPUにおいて64ビット幅の整数型を表現するために用意された。

long longのように、longを2つ連続させることで「longより大きな型」であることを表現するのは非常に醜いものではあるが、C99およびコンパイラの実装による事実上の標準があったために、C++もそれにならった。ただし、これは128ビット整数型に対応する際にlong long long型を定義することは意味しない。その際は、改めて型の定義を議論する必要があるが、いまはlong longで64ビット整数型を表現することとした。

関連項目

参照