Fundamental types
(関連項目: type 型システムの概要と、 C++ライブラリが提供する型関連ユーティリティの一覧 )
以下の型はまとめて fundamental types と呼ばれます:
- (possibly cv-qualified) 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
|
||||||
|
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
|
||||||
|
unsigned
int
|
||||||
|
long
|
long int |
少なくとも
32 |
32 | 32 | 32 | 64 |
|
long
int
|
||||||
|
signed
long
|
||||||
|
signed
long
int
|
||||||
|
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
|
||||||
|
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のデフォルトは通常符号なし、x86とx64のデフォルトは通常符号付きである。 - wchar_t — ワイド文字表現のための型( ワイド文字列 参照)。整数型の1つと同じサイズ、符号属性、アラインメントを持つが、異なる型である。実際には、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拡張フォーマット は x87 80ビット拡張精度フォーマット である。多くのx86およびx86-64実装で使用される(注目すべき例外はMSVCで、これは long double を double と同じフォーマット、すなわちbinary64で実装している)。
- PowerPCでは double-double が使用されることがある。
拡張浮動小数点型拡張浮動小数点型は実装定義です。これらには 固定幅浮動小数点型 が含まれる場合があります。 |
(C++23以降) |
プロパティ
浮動小数点型は 特殊な値 をサポートする場合があります:
- 無限大 (正および負)、 INFINITY を参照
- 負のゼロ ( - 0.0 )。正のゼロと等価と比較されるが、一部の算術演算(例: 1.0 / 0.0 == INFINITY 、ただし 1.0 / - 0.0 == - INFINITY )や数学関数(例: sqrt (std::complex) )で意味を持つ
- 非数 (NaN)。あらゆる値(自身を含む)と等価と比較されない。複数のビットパターンがNaNを表現する。 std::nan 、 NAN を参照。C++は std::numeric_limits::has_signaling_NaN によるサポート検出以外ではシグナリングNaNを特別扱いせず、全てのNaNをクワイエットとして扱うことに注意。
浮動小数点数は 算術演算子 + 、 - 、 / 、および * と共に使用できるほか、 <cmath> の様々な数学関数でも使用できます。組み込み演算子とライブラリ関数の両方が、浮動小数点例外を発生させ、 math errhandling で説明されているように errno を設定する可能性があります。
浮動小数点式は、その型で示される範囲と精度を超える可能性があります。詳細は FLT_EVAL_METHOD を参照してください。また浮動小数点式は 縮約 (すべての中間値が無限の範囲と精度を持つかのように計算される)される可能性もあります。詳細は #pragma STDC FP_CONTRACT を参照してください。標準C++は浮動小数点演算の精度を制限しません。
浮動小数点数の一部の操作は、 浮動小数点環境 の状態によって影響を受け、またその状態を変更します (特に丸め方向が顕著な例です)。
暗黙の変換 は浮動小数点型と整数型の間で定義されています。
浮動小数点型の詳細な制限と特性については、 浮動小数点型の制限 および std::numeric_limits を参照してください。
値の範囲
以下の表は、一般的な数値表現の制限に関するリファレンスを提供します。
C++20より前のC++標準では、あらゆる符号付き整数表現が許可されており、Nビット符号付き整数の保証される最小範囲は
-(2
N-1
-1)
から
+2
N-1
-1
まで(例:8ビット符号付き型の場合
−127
から
127
)であり、これは
1の補数
または
符号と絶対値表現
の限界に対応する。
しかし、すべてのC++コンパイラは
2の補数
表現を使用しており、C++20以降では標準で許可される唯一の表現であり、保証される範囲は
-2
N-1
から
+2
N-1
-1
までである(例:
−128
から
127
まで、符号付き8ビット型の場合)。
8ビットの1の補数および符号と絶対値表現による char は、C++11以降禁止されています( CWG issue 1759 の解決による)。これは、 UTF-8文字列リテラル で使用される値0x80のUTF-8コードユニットが、 char 型オブジェクトに格納可能でなければならないためです。
浮動小数点型
T
の範囲は以下のように定義されます:
-
保証される最小範囲は、
Tで表現可能な最も負の有限浮動小数点数からTで表現可能な最も正の有限浮動小数点数までである。 -
負の無限大が
Tで表現可能な場合、Tの範囲はすべての負の実数に拡張される。 -
正の無限大が
Tで表現可能な場合、Tの範囲はすべての正の実数に拡張される。
負の無限大と正の無限大は ISO/IEC/IEEE 60559 形式で表現可能であるため、ISO/IEC/IEEE 60559に準拠する浮動小数点型の表現可能な値の範囲内にすべての実数が含まれます。
| 型 | ビットサイズ | フォーマット | 値の範囲 | |
|---|---|---|---|---|
| 近似値 | 正確な値 | |||
| 文字型 | 8 | 符号付き | −128 から 127 | |
| 符号なし | 0 から 255 | |||
| 16 | UTF-16 | 0 から 65535 | ||
| 32 | UTF-32 | 0 から 1114111 ( 0x10ffff ) | ||
| 整数型 | 16 | 符号付き | ± 3.27 · 10 4 | −32768 から 32767 |
| 符号なし | 0 から 6.55 · 10 4 | 0 から 65535 | ||
| 32 | 符号付き | ± 2.14 · 10 9 | −2,147,483,648 から 2,147,483,647 | |
| 符号なし | 0 から 4.29 · 10 9 | 0 から 4,294,967,295 | ||
| 64 | 符号付き | ± 9.22 · 10 18 | −9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 | |
| 符号なし | 0 から 1.84 · 10 19 | 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
互換性と移植性の修正 (
(unsigned) char
配列の初期化を許可
UTF-8文字列リテラル
から)
|
キーワード
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標準 (ISO/IEC 14882:2020):
-
- 6.8.1 基本型 [basic.fundamental]
- C++17標準 (ISO/IEC 14882:2017):
-
- 6.9.1 基本型 [basic.fundamental]
- C++14標準 (ISO/IEC 14882:2014):
-
- 3.9.1 基本型 [basic.fundamental]
- C++11標準 (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 ドキュメント
の
算術型
|