最終更新日時(UTC):
が更新

履歴 編集

long long型 [N1811](C++11)

このページはC++11に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

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ビット整数型を表現することとした。

関連項目

参照