名前空間
変種
操作

基本型

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
基本型
列挙型
関数型
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

(型システムの概要についてはを、C++ ライブラリが提供する型関連ユーティリティの一覧については型関連ユーティリティを参照)

以下の型はまとめて基本型と呼ばれます

  • (cv修飾される可能性のある) 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 intlong 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以降)

[編集] ブール型

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

[編集] 文字型

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

signed char — 符号付き文字表現のための型。
unsigned char — 符号なし文字表現のための型。また、オブジェクト表現(生メモリ)の調査にも使用されます。
char — 対象システムで最も効率的に処理できる文字表現のための型(signed char または unsigned char と同じ表現とアライメントを持ちますが、常に別個の型です)。マルチバイト文字列は、コードユニットを表現するためにこの型を使用します。unsigned char 型の [0255] の範囲にあるすべての値について、その値を 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では満たせないため、欠陥と見なされ削除されました。

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::nanNAN を参照してください。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
  • 最小非正規化数
    ± 1.401,298,4 · 10−45
  • 最小正規化数
    ± 1.175,494,3 · 10−38
  • max
    ± 3.402,823,4 · 1038
  • 最小非正規化数
    ±0x1p−149
  • 最小正規化数
    ±0x1p−126
  • max
    ±0x1.fffffep+127
64 IEEE-754
  • 最小非正規化数
    ± 4.940,656,458,412 · 10−324
  • 最小正規化数
    ± 2.225,073,858,507,201,4 · 10−308
  • max
    ± 1.797,693,134,862,315,7 · 10308
  • 最小非正規化数
    ±0x1p−1074
  • 最小正規化数
    ±0x1p−1022
  • max
    ±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
  • max
    ± 1.189,731,495,357,231,765,021
     · 104932
  • 最小非正規化数
    ±0x1p−16445
  • 最小正規化数
    ±0x1p−16382
  • max
    ±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
  • max
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • 最小非正規化数
    ±0x1p−16494
  • 最小正規化数
    ±0x1p−16382
  • max
    ±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 (intlong、ポインタは32ビット);
  • Win32 API
  • UnixおよびUnixライクシステム(Linux、macOS)

64ビットシステム

  • LLP64 または 4/4/8 (intlong は32ビット、ポインタは64ビット)
  • Win32 API(Windows APIとも呼ばれる)で、コンパイルターゲットが64ビットARM(AArch64)またはx86-64(別名x64)の場合
  • LP64 または 4/8/8 (int は32ビット、long とポインタは64ビット)
  • UnixおよびUnixライクシステム(Linux、macOS)

他のモデルは非常に稀です。例えば、ILP64 (8/8/8: intlong、ポインタが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]

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)