基本型
(型システムの概要については型を、C++ ライブラリが提供する型関連ユーティリティの一覧については型関連ユーティリティを参照)
以下の型はまとめて基本型と呼ばれます
- (cv修飾される可能性のある) void
|
(C++11以降) |
目次 |
[編集] void
- void — 空の値の集合を持つ型です。これは不完全型であり、完全な型にすることはできません(その結果、void 型のオブジェクトは許可されません)。void の配列も、void への参照も存在しません。しかし、void へのポインタと、void 型を返す関数(他の言語でのプロシージャ)は許可されます。
|
std::nullptr_t
std::nullptr_t は、ヌルポインタリテラル sizeof(std::nullptr_t) は sizeof(void*) と等しくなります。 |
(C++11以降) |
[編集] 整数型
[編集] 標準整数型
- int — 基本整数型。以下に挙げる修飾子のいずれかが使用される場合、キーワード int は省略できます。長さの修飾子がない場合、少なくとも16ビットの幅を持つことが保証されます。しかし、32/64ビットシステムでは、ほとんどの場合、少なくとも32ビットの幅を持つことが保証されます(下記参照)。
[編集] 修飾子
基本整数型を修飾します。任意の順序で組み合わせることができます。各グループからは1つだけを型名に含めることができます。
- 符号
- signed — 対象の型は符号付き表現を持ちます(省略された場合のデフォルトです)
- unsigned — 対象の型は符号なし表現を持ちます
- サイズ
- short — 対象の型は領域のために最適化され、少なくとも16ビットの幅を持ちます。
- long — 対象の型は少なくとも32ビットの幅を持ちます。
|
|
(C++11以降) |
注:すべての型指定子と同様に、任意の順序が許可されます:unsigned long long int と long int unsigned long は同じ型を指します。
[編集] プロパティ
以下の表は、利用可能なすべての標準整数型と、様々な共通データモデルにおけるそれらのプロパティをまとめたものです
| 型指定子 | 等価な型 | データモデルごとのビット幅 | ||||
|---|---|---|---|---|---|---|
| C++標準 | LP32 | ILP32 | LLP64 | LP64 | ||
signed char
|
signed char | 少なくとも 8 |
8 | 8 | 8 | 8 |
unsigned char
|
unsigned char | |||||
short
|
short int | 少なくとも 16 |
16 | 16 | 16 | 16 |
short int
| ||||||
signed short
| ||||||
signed short int
| ||||||
unsigned short
|
unsigned short int | |||||
unsigned short int
| ||||||
int
|
int | 少なくとも 16 |
16 | 32 | 32 | 32 |
signed
| ||||||
signed int
| ||||||
unsigned
|
unsigned int | |||||
unsigned int
| ||||||
long
|
long int | 少なくとも 32 |
32 | 32 | 32 | 64 |
long int
| ||||||
signed long
| ||||||
signed long int
| ||||||
unsigned long
|
unsigned long int | |||||
unsigned long int
| ||||||
long long
|
long long int (C++11) |
少なくとも 64 |
64 | 64 | 64 | 64 |
long long int
| ||||||
signed long long
| ||||||
signed long long int
| ||||||
unsigned long long
|
unsigned long long int (C++11) | |||||
unsigned long long int
| ||||||
注:整数演算は、符号付き整数型と符号なし整数型で定義が異なります。詳細は算術演算子、特に整数オーバーフローを参照してください。
std::size_t は、sizeof 演算子、および sizeof... 演算子、alignof 演算子(C++11以降)の結果の符号なし整数型です。
拡張整数型拡張整数型は処理系定義です。固定幅整数型は通常、標準整数型のエイリアスであることに注意してください。 |
(C++11以降) |
[編集] ブール型
[編集] 文字型
文字型は、文字表現に使用される整数型です。
- signed char — 符号付き文字表現のための型。
- unsigned char — 符号なし文字表現のための型。また、オブジェクト表現(生メモリ)の調査にも使用されます。
- char — 対象システムで最も効率的に処理できる文字表現のための型(signed char または unsigned char と同じ表現とアライメントを持ちますが、常に別個の型です)。マルチバイト文字列は、コードユニットを表現するためにこの型を使用します。unsigned char 型の
[0,255]の範囲にあるすべての値について、その値を char に変換し、再び unsigned char に戻すと、元の値が生成されます。(C++11以降) char の符号の有無はコンパイラと対象プラットフォームに依存します:ARMとPowerPCのデフォルトは通常unsigned、x86とx64のデフォルトは通常signedです。 - wchar_t — ワイド文字表現のための型(ワイド文字列を参照)。整数型の一つと同じサイズ、符号、アライメントを持ちますが、別個の型です。実際には、Linuxや他の多くの非Windowsシステムでは32ビットでUTF-32を保持しますが、Windowsでは16ビットでUTF-16コードユニットを保持します。規格では以前、wchar_t がサポートされている任意の文字コードポイントを表現できるほど大きいことを要求していました。しかし、この要件はWindowsでは満たせないため、欠陥と見なされ削除されました。
|
|
(C++11以降) |
|
|
(C++20以降) |
最小ビット数に加えて、C++標準は以下を保証します
- 1 == sizeof(char)
≤sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)。
注:これは、バイトのサイズが64ビットで、すべての型(char を含む)が64ビット幅であり、sizeof がすべての型に対して 1 を返すという極端なケースを許容します。
[編集] 浮動小数点型
[編集] 標準浮動小数点型
以下の3つの型とそのcv修飾版は、まとめて標準浮動小数点型と呼ばれます。
- float — 単精度浮動小数点型。通常はIEEE-754 binary32形式。
- double — 倍精度浮動小数点型。通常はIEEE-754 binary64形式。
- long double — 拡張精度浮動小数点型。必ずしもIEEE-754で規定された型に対応するとは限りません。
- IEEE-754 binary128形式は、一部のHP-UX、SPARC、MIPS、ARM64、z/OSの実装で使用されます。
- 最もよく知られているIEEE-754 binary64-extended形式は、x87 80ビット拡張精度形式です。これは多くのx86およびx86-64実装で使用されます(MSVCは顕著な例外で、long double を double と同じ形式、すなわちbinary64で実装しています)。
- PowerPCでは、倍々精度が使用されることがあります。
拡張浮動小数点型拡張浮動小数点型は処理系定義です。これには固定幅浮動小数点型が含まれることがあります。 |
(C++23から) |
[編集] プロパティ
浮動小数点型は、特別な値をサポートすることがあります
- 無限大 (正と負)、INFINITY を参照
- 負のゼロ、-0.0。これは正のゼロと等しいと比較されますが、一部の算術演算で意味を持ちます。例:1.0 / 0.0 == INFINITY ですが、1.0 / -0.0 == -INFINITY)。また、sqrt(std::complex) のような一部の数学関数にとっても意味があります。
- 非数 (NaN)。これは何とも(自身を含む)等しいとみなされません。複数のビットパターンがNaNを表します。std::nan、NAN を参照してください。C++は、シグナリングNaNをstd::numeric_limits::has_signaling_NaNによってサポートが検出される以外は特別に扱いません。すべてのNaNをクワイエットとして扱います。
浮動小数点数は、算術演算子 +, -, /, * や、<cmath> の様々な数学関数と共に使用できます。組み込み演算子とライブラリ関数の両方が、math errhandling で説明されているように、浮動小数点例外を発生させ、errno を設定することがあります。
浮動小数点式の範囲と精度は、その型が示すものよりも大きくなることがあります。FLT_EVAL_METHOD を参照してください。浮動小数点式はまた、縮約されることもあります。つまり、すべての中間値が無限の範囲と精度を持つかのように計算されます。 #pragma STDC FP_CONTRACT を参照してください。標準C++は浮動小数点演算の精度を制限しません。
浮動小数点数に対する一部の操作は、浮動小数点環境の状態(最も顕著なのは丸め方向)に影響を受け、またそれを変更します。
浮動小数点型と整数型の間には暗黙の型変換が定義されています。
浮動小数点型の追加の詳細、制限、およびプロパティについては、浮動小数点型の限界とstd::numeric_limitsを参照してください。
[編集] 値の範囲
以下の表は、一般的な数値表現の限界についての参照を提供します。
C++20より前では、C++標準は任意の符号付き整数表現を許可しており、Nビット符号付き整数の保証される最小範囲は -(2N-1
-1) から +2N-1
-1 まででした(例:符号付き8ビット型で −127 から 127)。これは1の補数や符号と絶対値の限界に対応します。
しかし、すべてのC++コンパイラは2の補数表現を使用しており、C++20からは、これが標準で許可される唯一の表現となり、保証される範囲は -2N-1
から +2N-1
-1 までです(例:符号付き8ビット型で −128 から 127)。
UTF-8文字列リテラルで使用される値0x80のUTF-8コードユニットはchar型オブジェクトに格納できなければならないため、charに対する8ビットの1の補数および符号と絶対値表現は、C++11以降(CWG issue 1759の解決により)許可されていません。
浮動小数点型 T の範囲は次のように定義されます
- 保証される最小範囲は、
Tで表現可能な最も負の有限浮動小数点数から、Tで表現可能な最も正の有限浮動小数点数までです。 - 負の無限大が
Tで表現可能な場合、Tの範囲はすべての負の実数に拡張されます。 - 正の無限大が
Tで表現可能な場合、Tの範囲はすべての正の実数に拡張されます。
負と正の無限大はISO/IEC/IEEE 60559形式で表現可能であるため、すべての実数はISO/IEC/IEEE 60559に準拠する浮動小数点型の表現可能な値の範囲内にあります。
| 型 | ビットサイズ | フォーマット | 値の範囲 | |
|---|---|---|---|---|
| 概算 | 正確 | |||
| 文字 | 8 | signed | −128 から 127 | |
| unsigned | 0 から 255 | |||
| 16 | UTF-16 | 0 から 65535 | ||
| 32 | UTF-32 | 0 から 1114111 (0x10ffff) | ||
| 整数 | 16 | signed | ± 3.27 · 104 | −32768 から 32767 |
| unsigned | 0 から 6.55 · 104 | 0 から 65535 | ||
| 32 | signed | ± 2.14 · 109 | −2,147,483,648 から 2,147,483,647 | |
| unsigned | 0 から 4.29 · 109 | 0 から 4,294,967,295 | ||
| 64 | signed | ± 9.22 · 1018 | −9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 | |
| unsigned | 0 から 1.84 · 1019 | 0 から 18,446,744,073,709,551,615 | ||
| 2進 浮動 小数点 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
| |
| 80[注1] | x86 |
|
| |
| 128 | IEEE-754 |
|
| |
- ↑ オブジェクト表現は通常、32/64ビットプラットフォームでそれぞれ96/128ビットを占有します。
注:これらの型で表現可能な値の実際の(保証される最小値とは対照的な)限界は、Cの数値限界インターフェースおよびstd::numeric_limitsで利用可能です。
[編集] データモデル
各実装が基本型のサイズについて行う選択は、まとめてデータモデルとして知られています。4つのデータモデルが広く受け入れられています
32ビットシステム
- LP32 または 2/4/4 (int は16ビット、long とポインタは32ビット)
- Win16 API
- ILP32 または 4/4/4 (int、long、ポインタは32ビット);
- Win32 API
- UnixおよびUnixライクシステム(Linux、macOS)
64ビットシステム
- LLP64 または 4/4/8 (int と long は32ビット、ポインタは64ビット)
- LP64 または 4/8/8 (int は32ビット、long とポインタは64ビット)
- UnixおよびUnixライクシステム(Linux、macOS)
他のモデルは非常に稀です。例えば、ILP64 (8/8/8: int、long、ポインタが64ビット) は、一部の初期の64ビットUnixシステム(例:CrayのUNICOS)でのみ見られました。
[編集] 注釈
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_unicode_characters |
200704L |
(C++11) | 新しい文字型 (char16_t および char32_t) |
__cpp_char8_t |
201811L |
(C++20) | char8_t |
202207L |
(C++23) | char8_t の互換性と移植性の修正 (UTF-8文字列リテラルからの (unsigned) char配列の初期化を許可) |
[編集] キーワード
void, bool, true, false, char, char8_t, char16_t, char32_t, wchar_t, int, short, long, signed, unsigned, float, double
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 238 | C++98 | 浮動小数点実装に課される制約が未指定だった | 指定された 制約なし |
| CWG 1759 | C++11 | char がUTF-8コードユニット0x80を表現できることが保証されていなかった | 保証された |
| CWG 2689 | C++11 | cv修飾された std::nullptr_t は基本型ではなかった | そうである |
| CWG 2723 | C++98 | 浮動小数点型で表現可能な値の範囲が指定されていなかった | 指定された |
| P2460R2 | C++98 | wchar_t は、サポートされるロケールの中で指定された最大の拡張文字セットの すべてのメンバーに対して異なるコードを表現できることが要求されていた |
要求されない |
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 6.8.2 基本型 [basic.fundamental]
- C++20 standard (ISO/IEC 14882:2020)
- 6.8.1 基本型 [basic.fundamental]
- C++17 standard (ISO/IEC 14882:2017)
- 6.9.1 基本型 [basic.fundamental]
- C++14 standard (ISO/IEC 14882:2014)
- 3.9.1 基本型 [basic.fundamental]
- C++11 standard (ISO/IEC 14882:2011)
- 3.9.1 基本型 [basic.fundamental]
- C++03 標準 (ISO/IEC 14882:2003)
- 3.9.1 基本型 [basic.fundamental]
- C++98 標準 (ISO/IEC 14882:1998)
- 3.9.1 基本型 [basic.fundamental]
[編集] 関連項目
| 算術型についてのC言語のドキュメンテーション
|