Namespaces
Variants

Fundamental types

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

(関連項目: type 型システムの概要と、 C++ライブラリが提供する型関連ユーティリティの一覧 )

以下の型はまとめて fundamental types と呼ばれます:

  • (possibly cv-qualified) void
(C++11以降)

目次

void

void — 値の空集合を持つ型。これは 不完全型 であり、完全化することはできません(したがって、 void 型のオブジェクトは許可されません)。 void 配列 void への 参照 は存在しません。しかしながら、 void へのポインタ および void 型を返す 関数 (他の言語での プロシージャ )は許可されます。

std::nullptr_t

ヘッダーで定義 <cstddef>
typedef decltype ( nullptr ) nullptr_t ;
(C++11以降)

std::nullptr_t はヌルポインタリテラル nullptr の型である。これはポインタ型やメンバポインタ型自体ではない独自の型である。そのすべてのprvalueは ヌルポインタ定数 である。

sizeof ( std:: nullptr_t ) sizeof ( void * ) と等しい。

(C++11以降)

整数型

標準整数型

int — 基本整数型。以下の修飾子が使用される場合、 int キーワードは省略可能。長さ修飾子が存在しない場合、少なくとも16ビットの幅を持つことが保証される。ただし、32/64ビットシステムでは、ほぼ例外なく少なくとも32ビットの幅を持つことが保証される(下記参照)。
修飾子

基本整数型を修飾します。任意の順序で組み合わせることができます。各グループからは型名に1つしか含めることができません。

  • 符号付き/符号なし:
signed — 対象の型は符号付き表現を持つ(省略時はこれがデフォルト)
unsigned — 対象の型は符号なし表現を持つ
  • サイズ:
short — ターゲット型はサイズ最適化され、少なくとも16ビットの幅を持ちます。
long — ターゲット型は少なくとも32ビットの幅を持ちます。

long long — ターゲット型は少なくとも64ビットの幅を持つ。
(C++11以降)

注記: 全ての型指定子と同様に、任意の順序が許可されます: unsigned long long int long int unsigned long は同じ型を表します。

プロパティ

以下の表は、利用可能なすべての標準整数型と、様々な一般的なデータモデルにおけるそれらのプロパティをまとめたものです:

**翻訳結果:** HTMLタグ、属性、および` `内のC++用語(`unsigned char`)は翻訳せず、元のフォーマットを保持しています。 **説明:** - HTMLタグ、属性、CSSスタイルはそのまま保持されています - ` `タグ内のC++キーワード「short」と「int」は翻訳対象外として保持されています - 元のフォーマットと構造が完全に維持されています **翻訳結果の説明:** - HTMLタグ、属性、CSSスタイルはすべてそのまま保持されています - ` ` タグ内のC++キーワード「signed」と「short」は翻訳対象外として保持されています - 元のフォーマットと構造は完全に維持されています - C++固有の用語は翻訳せず、原文のままです **翻訳結果:** **説明:** - HTMLタグと属性はすべて保持されています - ` `タグ内のC++キーワード(signed, short, int)は翻訳対象外として保持されています - 元のフォーマットと構造は完全に維持されています **説明:** - HTMLタグ、属性、および` `内のC++キーワード(`unsigned`、`short`、`int`)は翻訳せず、元のまま保持しています - 書式設定と構造は完全に維持されています - C++専門用語は原文のまま残しています **説明:** - HTMLタグと属性はすべてそのまま保持されています - ` `タグ内のテキスト`signed`はC++のキーワードであるため、翻訳せずにそのまま残しています - 元のフォーマットと構造が完全に維持されています **説明:** - HTMLタグ、属性、CSSスタイルはすべてそのまま保持されています - ` `内のC++キーワード`signed int`は翻訳対象外として保持されています - 元のフォーマットと構造が完全に維持されています **翻訳結果:** **説明:** - HTMLタグと属性はすべて保持されています - ` `内のC++コード(`unsigned int`)は翻訳対象外として保持されています - C++の専門用語(`unsigned int`)は翻訳せずそのまま維持されています - 元のフォーマットと構造は完全に保持されています **説明:** - HTMLタグ、属性、および` `内のC++コード(`long int`)は翻訳せず、元のまま保持しています - 書式設定と構造は完全に維持されています - C++の専門用語(`long int`)はそのまま残しています **説明:** - HTMLタグ、属性、および` `内のC++キーワード(`signed`、`long`)は翻訳せず、元のまま保持されています - 書式設定と構造は完全に維持されています - C++の専門用語はそのまま残し、HTML要素内のテキストのみを翻訳対象から除外しました **翻訳結果:** **説明:** - HTMLタグと属性はすべて保持されています - ` `タグ内のC++キーワード(signed, long, int)は翻訳対象外です - C++の専門用語はそのまま保持されています - 元のフォーマットと構造は完全に維持されています **注記**: このHTMLコード内のテキストはすべてC++のキーワード(`unsigned`, `long`, `int`)であり、C++固有の用語として翻訳対象外のため、原文のまま保持されています。HTMLタグや属性、書式もすべて変更せずに維持されています。 翻訳内容: - "at least" → "少なくとも" - C++のキーワード(long, long long, int)は翻訳せず保持 - HTMLタグ、属性、 内のコードは完全に保持 - 数値(64)は翻訳せず保持 - (C++11)は技術的な表記のため保持 **翻訳結果:** **説明:** - HTMLタグと属性はすべて保持されています - ` `タグ内のC++コードは翻訳対象外のため、元のまま保持されています - C++のキーワード(signed, long, long)は専門用語として翻訳していません - フォーマットと構造は完全に保持されています **説明:** - HTMLタグ、属性、CSSスタイルはすべてそのまま保持されています - ` `内のC++キーワード(signed, long, long, int)は翻訳対象外のため原文のままです - C++の専門用語は翻訳せず、元のフォーマットを完全に保持しています **注記**: このHTMLコード内のテキストは以下の理由で翻訳されていません: - ` `タグ内のテキストはC++のキーワード(`unsigned`, `long`, `int`)であり、C++固有の用語として保持 - ` `内の「(C++11)」はプログラミング言語のバージョン指定であり、技術文書では翻訳しないのが標準的 HTMLタグ、属性、およびコードブロック内のテキストはすべて元のまま保持されています。
型指定子 等価な型 ビット幅( データモデル 別)
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以降)

ブーリアン型

bool — 2つの値のいずれかを保持できる整数型: true または false sizeof ( bool ) の値は実装定義であり、 1 と異なる場合がある。

文字型

文字型は、文字表現に使用される整数型です。

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では満たせないため、 欠陥 と見なされ削除された。

char16_t — UTF-16文字表現のための型。あらゆるUTF-16コード単位(16ビット)を表現するのに十分な大きさが必要です。サイズ、符号属性、アライメントは std::uint_least16_t と同じですが、異なる型です。

char32_t — UTF-32文字表現のための型。あらゆるUTF-32コード単位(32ビット)を表現するのに十分な大きさが必要です。サイズ、符号属性、アライメントは std::uint_least32_t と同じですが、異なる型です。
(C++11以降)

char8_t — UTF-8文字表現のための型。あらゆるUTF-8コード単位(8ビット)を表現するのに十分な大きさが必要です。サイズ、符号属性、アラインメントは unsigned char と同じ(したがって、サイズとアラインメントは char および signed char と同じ)ですが、異なる型です。
(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で規定される型にマップされるとは限らない。

拡張浮動小数点型

拡張浮動小数点型は実装定義です。これらには 固定幅浮動小数点型 が含まれる場合があります。

(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
  • 最小サブノーマル:
    ± 1.401,298,4 · 10 −45
  • 最小ノーマル:
    ± 1.175,494,3 · 10 −38
  • 最大値:
    ± 3.402,823,4 · 10 38
  • 最小サブノーマル:
    ±0x1p−149
  • 最小ノーマル:
    ±0x1p−126
  • 最大値:
    ±0x1.fffffep+127
64 IEEE-754
  • 最小サブノーマル:
    ± 4.940,656,458,412 · 10 −324
  • 最小ノーマル:
    ± 2.225,073,858,507,201,4 · 10 −308
  • 最大値:
    ± 1.797,693,134,862,315,7 · 10 308
  • 最小サブノーマル:
    ±0x1p−1074
  • 最小ノーマル:
    ±0x1p−1022
  • 最大値:
    ±0x1.fffffffffffffp+1023
80 [注 1] x86
  • 最小サブノーマル:
    ± 3.645,199,531,882,474,602,528
    · 10 −4951
  • 最小ノーマル:
    ± 3.362,103,143,112,093,506,263
    · 10 −4932
  • 最大値:
    ± 1.189,731,495,357,231,765,021
    · 10 4932
  • 最小サブノーマル:
    ±0x1p−16445
  • 最小ノーマル:
    ±0x1p−16382
  • 最大値:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • 最小サブノーマル:
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10 −4966
  • 最小ノーマル:
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10 −4932
  • 最大値:
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 10 4932
  • 最小サブノーマル:
    ±0x1p−16494
  • 最小ノーマル:
    ±0x1p−16382
  • 最大値:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. オブジェクト表現は通常、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]

関連項目