最終更新日時(UTC): 2025年07月04日 14時58分11秒
rotarymars が更新

履歴 編集

# 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`サフィックスを使用する。
  - 符号指定を除く`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`

## 参照

- N0715 Incorporate the `long long` integral data type in C++
- N1565 Adding the `long long` type to C++
- N1735 Adding the `long long` type to C++ (Revision 2)
- N1811 Adding the `long long` type to C++ (Revision 3)