算術型
(型システム概要については型、Cライブラリが提供する型関連ユーティリティのリストについては型関連ユーティリティのリストも参照してください。)
真偽型なお、変換は_Bool(C23まで)bool(C23以降)は他の整数型への変換とは異なる動作をします。(bool)0.5はtrueと評価されますが、(int)0.5は0と評価されます。 |
(C99以降) |
[編集] 文字型
- signed char — 符号付き文字表現のための型。
- unsigned char — 符号なし文字表現のための型。また、オブジェクト表現(生メモリ)を検査するためにも使用されます。
- char — 文字表現のための型。signed charまたはunsigned charのいずれかと等価ですが(どちらかは実装定義であり、コンパイラのコマンドラインスイッチによって制御される場合があります)、charはsigned charともunsigned charとも異なる、独立した型です。
標準ライブラリは、ワイド文字を表現するためにtypedef名wchar_t, char16_t, char32_t(C11以降)、そしてUTF-8文字のためにchar8_t(C23以降)も定義していることに注意してください。
[編集] 整数型
- short int (またはshort、キーワードsignedも使用可能)
- unsigned short int (またはunsigned short)
- int (またはsigned int)
- これはプラットフォームにとって最も最適な整数型であり、少なくとも16ビットであることが保証されています。現在のほとんどのシステムは32ビットを使用しています(以下のデータモデルを参照)。
- unsigned int (またはunsigned)、intの符号なし対応型で、剰余演算を実装しています。ビット操作に適しています。
- long int (またはlong)
- unsigned long int (またはunsigned long)
|
(C99以降) |
|
(C23以降) |
注意:すべての型指定子と同様に、どのような順序でも許可されます。unsigned long long intとlong int unsigned longは同じ型を指します。
次の表は、利用可能なすべての整数型とそのプロパティをまとめたものです。
| 型指定子 | 等価な型 | データモデルによるビット幅 | ||||
|---|---|---|---|---|---|---|
| C標準 | LP32 | ILP32 | LLP64 | LP64 | ||
char
|
char | 少なくとも 8 |
8 | 8 | 8 | 8 |
signed char
|
signed char | |||||
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 (C99) |
少なくとも 64 |
64 | 64 | 64 | 64 |
long long int
| ||||||
signed long long
| ||||||
signed long long int
| ||||||
unsigned long long
|
unsigned long long int (C99) | |||||
unsigned long long int
| ||||||
最小ビット数に加えて、C標準は次のことを保証しています。
- 1 == sizeof(char)
≤sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)。
注意:これは、バイトが64ビットにサイズ変更され、すべての型(charを含む)が64ビット幅であり、sizeofがすべての型に対して1を返すという極端なケースも許容します。
注意:整数演算は、符号付きおよび符号なし整数型で異なる定義がされています。特に整数オーバーフローについて、算術演算子を参照してください。
[編集] データモデル
各実装が基本型のサイズについて行った選択は、総称して「データモデル」と呼ばれます。4つのデータモデルが広く受け入れられています。
32ビットシステム
- LP32または2/4/4 (intは16ビット、longとポインタは32ビット)
- Win16 API
- ILP32または4/4/4 (int、long、およびポインタは32ビット);
- Win32 API
- UnixおよびUnix系システム (Linux, Mac OS X)
64ビットシステム
- LLP64または4/4/8 (intとlongは32ビット、ポインタは64ビット)
- Win64 API
- LP64または4/8/8 (intは32ビット、longとポインタは64ビット)
- UnixおよびUnix系システム (Linux, Mac OS X)
他のモデルは非常に稀です。例えば、ILP64 (8/8/8: int、long、およびポインタは64ビット) は、一部の初期の64ビットUnixシステム(例:Cray上のUnicos)にのみ登場しました。
C99以降、<stdint.h>で厳密幅整数型が利用可能であることに注意してください。
[編集] 実浮動小数点型
Cには実浮動小数点値を表現するための3つまたは6つの(C23以降)型があります。
- float — 単精度浮動小数点型。サポートされていればIEEE-754 binary32形式に一致します。
- double — 倍精度浮動小数点型。サポートされていればIEEE-754 binary64形式に一致します。
- long double — 拡張精度浮動小数点型。サポートされていればIEEE-754 binary128形式に一致し、そうでなければサポートされていればIEEE-754 binary64-extended形式に一致し、そうでなければその精度がbinary64よりも優れており、範囲が少なくともbinary64と同等である限り、IEEE-754ではない何らかの拡張浮動小数点形式に一致し、そうでなければIEEE-754 binary64形式に一致します。
- binary128形式は、一部のHP-UX、SPARC、MIPS、ARM64、z/OSの実装で使われています。
- 最もよく知られているIEEE-754 binary64-extended形式は80ビットのx87拡張精度形式です。これは多くのx86およびx86-64の実装で使われています(特筆すべき例外はMSVCで、long doubleをdoubleと同じ形式、つまりbinary64で実装しています)。
|
(C23以降) |
浮動小数点型は特殊な値をサポートする場合があります。
- 無限大 (正および負), INFINITYを参照
- 負のゼロ、-0.0。正のゼロと比較して等しいですが、特定の算術演算では意味を持ちます(例:1.0 / 0.0 == INFINITYですが、1.0 / -0.0 == -INFINITY)
- 非数 (NaN)。自身を含む何とも比較しても等しくなりません。複数のビットパターンがNaNを表します。nan、NANを参照。CはシグナリングNaN(IEEE-754で規定)を特別に扱わず、すべてのNaNを静かなNaNとして扱います。
実浮動小数点数は、算術演算子+ - / * および<math.h>からの様々な数学関数と共に使用できます。組み込み演算子とライブラリ関数の両方で浮動小数点例外が発生し、math_errhandlingで説明されているようにerrnoが設定される場合があります。
浮動小数点式は、その型で示される範囲と精度よりも大きな範囲と精度を持つ場合があります。FLT_EVAL_METHODを参照してください。代入、return、キャストは、範囲と精度を宣言された型に関連するものに強制します。
浮動小数点式は「縮約」されることもあります。つまり、すべての中間値が無限の範囲と精度を持つかのように計算されます。 #pragma STDC FP_CONTRACTを参照してください。
浮動小数点数に対する一部の操作は、浮動小数点環境の状態(特に丸め方向)に影響を受け、それを変更します。
実浮動小数点型と整数型、複素数型、虚数型の間には暗黙の型変換が定義されています。
追加の詳細、制限、および浮動小数点型のプロパティについては、浮動小数点型の制限と<math.h>ライブラリを参照してください。
複素浮動小数点型複素浮動小数点型は数学的な複素数をモデル化します。これは実数と虚数単位を掛けた実数の和として書ける数です。a + bi 3つの複素数型は
注意:すべての型指定子と同様に、どのような順序でも許可されます。long double complex、complex long double、さらにdouble complex longも同じ型を指します。 このコードを実行 出力 1/(1.0+2.0i) = 0.2-0.4i
各複素数型は、対応する実数型(float complexにはfloat、double complexにはdouble、long double complexにはlong double)の2要素からなる配列と同じオブジェクト表現およびアラインメント要件を持ちます。配列の最初の要素は実部を保持し、配列の2番目の要素は虚部を保持します。 複素数は算術演算子 インクリメントとデクリメントは複素数型には定義されていません。 関係演算子は複素数型には定義されていません(「より小さい」という概念がないため)。
複素数演算の1無限大モデルをサポートするために、Cでは少なくとも1つの無限大成分を持つ複素数値は、たとえ他の成分がNaNであっても無限大とみなされ、すべての演算子と関数が無限大の基本的なプロパティを尊重することを保証し、すべての無限大を正準なものにマップするcprojを提供します(正確な規則については算術演算子を参照)。 このコードを実行 #include <complex.h> #include <math.h> #include <stdio.h> int main(void) { double complex z = (1 + 0*I) * (INFINITY + I*INFINITY); // textbook formula would give // (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN // but C gives a complex infinity printf("%f%+f*i\n", creal(z), cimag(z)); // textbook formula would give // cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN // but C gives ±∞+i*nan double complex y = cexp(INFINITY + I*NAN); printf("%f%+f*i\n", creal(y), cimag(y)); } 実行結果の例 inf+inf*i inf+nan*i Cはまた、直交座標表現の固有の限界にもかかわらず、可能な限り方向情報を維持するように複数の無限大を扱います。 虚数単位に実無限大を乗じると、正しい符号の虚無限大が得られます:i × ∞ = i∞。また、i × (∞ – i∞) = ∞ + i∞は妥当な象限を示します。
虚数浮動小数点型虚数浮動小数点型は、数学的な虚数、すなわち実数に虚数単位を掛けた数biをモデル化します。3つの虚数型は
注意:すべての型指定子と同様に、どのような順序でも許可されます。long double imaginary、imaginary long double、さらにdouble imaginary longも同じ型を指します。 このコードを実行 出力 1/(3.0i) = -0.3i
3つの虚数型それぞれは、その対応する実数型(float imaginaryにはfloat、double imaginaryにはdouble、long double imaginaryにはlong double)と同じオブジェクト表現とアラインメント要件を持ちます。 注意:それにもかかわらず、虚数型は異なる型であり、対応する実数型と互換性がないため、エイリアシングは禁止されます。 虚数は、算術演算子 インクリメントとデクリメントは虚数型には定義されていません。
虚数を使用すると、すべての複素数を自然な表記x + I*y(ここでIは_Imaginary_Iとして定義されます)で表現することができます。虚数型がなければ、特定の特殊な複素数値を自然に作成することはできません。例えば、Iが_Complex_Iとして定義されている場合、0.0 + I*INFINITYと書くと実部がNaNになり、代わりにCMPLX(0.0, INFINITY)を使用する必要があります。同様に、csqrtのような分岐切断を持つライブラリ関数を扱う場合に意味を持つ、負のゼロ虚数成分を持つ数についても言えます。1.0 - 0.0*Iは、Iが_Complex_Iとして定義されている場合、正のゼロ虚数成分になります。負のゼロ虚数部にはCMPLXまたはconjの使用が必要です。 虚数型は実装も簡素化します。虚数型がサポートされている場合、虚数と複素数の乗算は、4回の乗算と2回の加算の代わりに、2回の乗算で直接実装できます。 |
(C99以降) |
[編集] キーワード
- bool, true, false, char, int, short, long, signed, unsigned, float, double.
- _Bool, _BitInt, _Complex, _Imaginary, _Decimal32, _Decimal64, _Decimal128.
[編集] 値の範囲
次の表は、一般的な数値表現の制限に関するリファレンスを提供します。
C23より前では、C標準は任意の符号付き整数表現を許可しており、Nビット符号付き整数に保証される最小範囲は-(2N-1
-1)から+2N-1
-1(例:8ビット符号付き型では-127から127)であり、これは1の補数または符号と絶対値表現の限界に対応していました。
しかし、すべての一般的なデータモデル(ILP32、LP32、LP64、LLP64のすべてを含む)とほとんどすべてのCコンパイラは2の補数表現を使用しており(既知の唯一の例外はUNISYS用の一部のコンパイラです)、C23現在、それは標準で許可されている唯一の表現であり、-2N-1
から+2N-1
-1(例:8ビット符号付き型では-128から127)までの範囲が保証されています。
| 型 | ビットサイズ | フォーマット | 値の範囲 | |
|---|---|---|---|---|
| 概算 | 正確 | |||
| 文字 | 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 |
|
| |
| 10進数 浮動小数点 点 |
32 | IEEE-754 |
| |
| 64 | IEEE-754 |
| ||
| 128 | IEEE-754 |
| ||
- ↑ オブジェクト表現は通常、32/64ビットプラットフォームではそれぞれ96/128ビットを占めます。
注: (保証された最小値とは対照的に)実際の範囲は、ライブラリヘッダ<limits.h>と<float.h>で利用できます。
[編集] 関連項目
| C++ドキュメント - 基本型
|