このページは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
サフィックスを使用する。- 符号指定を除く
ll
とLL
の部分では、大文字と小文字の混在は許可しない。(lL
やLl
は許可されないが、'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ビット整数型を表現することとした。
関連項目
LLONG_MIN
LLONG_MAX
ULLONG_MAX
int64_t
int_fast64_t
int_least64_t
uint64_t
uint_fast64_t
uint_least64_t