算術型
(型システムの概要については型も参照してください。 C のライブラリによって提供されている型関連ユーティリティの一覧も参照してください。)
ブーリアン型_Bool への変換は他の整数型への変換と同じには動作しないことに注意してください。 |
(C99以上) |
文字型
signed charー 符号付き文字表現のための型。unsigned charー 符号なし文字表現のための型。 オブジェクト表現 (生のメモリ) を調べるためにも使用されます。charー 文字表現のための型。signed charまたはunsigned charのいずれか (いずれであるかは処理系定義であり、コンパイラのコマンドラインオプションで制御できることもあります) と同等ですが、charはsigned charともunsigned charとも異なる独立した型です。
標準ライブラリはワイド文字を表す typedef 名 wchar_t、 char16_t、および char32_t (C11以上) も定義していることに注意してください。
整数型
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以上) |
ノート: 型指定子と同様に、任意の順序で記述できます。 unsigned long long int と long int unsigned long は同じ型を表します。
以下の表はすべての利用可能な整数型とその性質の要約です。
| 型指定子 | 同等な型 | データモデルごとのビット幅 | ||||
|---|---|---|---|---|---|---|
| C標準 | LP32 | ILP32 | LLP64 | LP64 | ||
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 システム (クレイの Unicos など) でのみ見られました。
C99 以上では <stdint.h> で正確な幅の整数型が利用可能であることに注意してください。
実数浮動小数点型
C には実数の浮動小数点値を表す型が3つあります。
floatー 単精度浮動小数点型。 サポートされていれば、 IEEE-754 の32ビット浮動小数点型に対応します。doubleー 倍精度浮動小数点型。 サポートされていれば、 IEEE-754 の64ビット浮動小数点型に対応します。long doubleー 拡張精度浮動小数点型。 サポートされていれば、 IEEE-754 の拡張浮動小数点型に対応します。 そうでなければ、精度がdoubleと同等以上かつ範囲がdoubleと同等以上の何らかの非標準な拡張浮動小数点型に対応します。 そうでなければ、double型と同等です。 一部の x86 および x86_64 の処理系は x87 の80ビット浮動小数点型を使用します。
浮動小数点型は以下のような特別な値をサポートすることがあります。
- 無限大 (正および負)。 INFINITY を参照してください。
- 負のゼロ
-0.0。 正のゼロと比較すると等しくなりますが、一部の算術演算では意味があります (例えば1.0/0.0 == INFINITYだけれども1.0/-0.0 == -INFINITYです)。 - 非数 (NaN)。 いかなる値 (自分自身も含む) と比較しても等しくなりません。 NaN を表すビットパターンは複数あります (nan および NAN を参照してください)。 C は signaling NaN (IEEE-754 で規定されています) に対して特別な扱いを行っておらず、すべての NaN を quiet として扱います。
実数浮動小数点数は算術演算子 + - * / および <math.h> の様々な数学関数で使用することができます。 組み込みの演算子とライブラリ関数はどちらも、 math_errhandling で説明されている通りに、浮動小数点例外を発生したり、 errno を設定したりすることがあります。
浮動小数点式は、その型によって示されるよりも広い範囲や高い精度を持つことがあります (FLT_EVAL_METHOD を参照してください)。 代入、 return、および キャストは、範囲と精度を宣言された型のものに強制します。
浮動小数点式は、縮約される、つまり、すべての中間値が無限の範囲と精度を持つかのように計算されることもあります (#pragma STDC FP_CONTRACT を参照してください)。
浮動小数点数に対する演算には、浮動小数点環境の状態によって影響を受けるものや、その状態を変更するものがあります (最も顕著なものは、丸めの方向です)。
実数浮動小数点型、整数型、複素数型、虚数型の間で、暗黙の変換が定義されています。
浮動小数点型のさらなる詳細、限界、および性質については、浮動小数点型の限界および <math.h> ライブラリを参照してください。
複素数浮動小数点型複素数浮動小数点型は、数学の複素数、つまり、実数と実数に虚数単位を掛けたものの和として表記される数 (a + bi) を、モデル化します。 以下の3つの複素数型があります。
ノート: 型指定子と同様に、任意の順序で記述できます。 Run this code #include <complex.h>
#include <stdio.h>
int main(void)
{
double complex z = 1 + 2*I;
z = 1/z;
printf("1/(1.0+2.0i) = %.1f%+.1fi\n", creal(z), cimag(z));
}
出力: 1/(1.0+2.0i) = 0.2-0.4i
複素数型は、対応する実数型 ( float a[4] = {1, 2, 3, 4};
float complex z1, z2;
memcpy(&z1, a, sizeof z1); // z1 は 1.0 + 2.0i になります。
memcpy(&z2, a+2, sizeof z2); // z2 は 3.0 + 4.0i になります。
複素数は算術演算子 + - * / で使用することができます (虚数および実数と混ぜて演算しても構いません)。 <complex.h> で多くの複素数用の数学関数が定義されています。 組み込みの演算子とライブラリ関数はどちらも、 math_errhandling で説明されている通りに、浮動小数点例外を発生したり、 errno を設定したりすることがあります。 インクリメントおよびデクリメントは複素数型に対しては定義されません。 関係演算子は複素数型に対しては定義されません (「より小さい」という概念はありません)。
複素数型とそれ以外の算術型の間で暗黙の変換が定義されます。 複素数算術の1つの無限大のモデルをサポートするために、 C では、少なくとも一方の部分が無限大であるあらゆる複素数値は、たとえ他方の部分が NaN であっても、無限大として扱い、すべての演算子および関数が無限大の基本的な性質を尊重することを保証し、すべての無限大を標準的な無限大にマップするための cproj を提供します (正確なルールについては算術演算子を参照してください)。 Run this code #include <stdio.h>
#include <complex.h>
#include <math.h>
int main(void)
{
// 教科書の数式では
// (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN
// ですが、 C では複素無限大になります。
double complex z = (1 + 0*I) * (INFINITY + I*INFINITY);
printf("%f + i*%f\n", creal(z), cimag(z));
// 教科書の数式では
// cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN
// ですが、 C では ±∞ + i*nan になります。
double complex y = cexp(INFINITY + I*NAN);
printf("%f + i*%f\n", creal(y), cimag(y));
}
出力例: inf + i*inf
inf + i*nan
また、 C は、直交座標系による限界はあるものの、可能であれば方向の情報を維持するように、無限大を扱います。 虚数単位に実数無限大を掛けると正しい符号の虚数無限大になります (i × ∞ = i∞)。 また、 i × (∞ – i∞) = ∞ + i∞ は妥当な象限を示します。
虚数浮動小数点型虚数浮動小数点型は、数学の虚数、つまり、実数に虚数単位を掛けたものとして表記される数 (bi) を、モデル化します。 以下の3つの虚数型があります。
ノート: 型指定子と同様に、任意の順序で記述できます。 Run this code #include <complex.h>
#include <stdio.h>
int main(void)
{
double imaginary z = 3*I;
z = 1/z;
printf("1/(3.0i) = %+.1fi\n", cimag(z));
}出力: 1/(3.0i) = -0.3i
虚数型は、対応する実数型 ( ノート: 虚数型は独立した型であり、対応する実数型と互換ではありません。 これはエイリアシングを禁止します。 虚数は算術演算子 + - * / で使用できます (複素数および実数と混ぜて演算しても構いません)。 <complex.h> で多くの虚数用の数学関数が定義されています。 組み込みの演算子とライブラリ関数はどちらも、 math_errhandling で説明されている通りに、浮動小数点例外を発生したり、 errno を設定したりすることがあります。 インクリメントおよびデクリメントは虚数型に対しては定義されません。
虚数型とそれ以外の算術型の間で暗黙の変換が定義されます。 虚数は自然な表記 虚数型は実装も単純化します。 虚数と複素数の乗算は、虚数がサポートされていれば、4回の乗算と2回の加算ではなく、2回の乗算でストレートに実装できます。 |
(C99以上) |
値の範囲
以下の表は一般的な数値表現の限界についてのリファレンスを提供します。 C 標準はどのような符号付き整数表現も認めているため、以下の表には保証されている最低限の要件 (1の補数に対応するもの) および最も一般的に使用されている実装の限界 (2の補数に対応するもの) の両方を掲載しています。 しかし、一般的なデータモデル (ILP32、 LP32、 LP64、 LLP64 など) はすべて、2の補数表現を使用しています。
| 型 | ビット数 | 形式 | 値の範囲 | |
|---|---|---|---|---|
| 概算値 | 正確な値 | |||
| 文字 | 8 | 符号付き (1の補数) |
-127 〜 127 | |
| 符号付き (2の補数) |
-128 〜 127 | |||
| 符号なし | 0 〜 255 | |||
| 整数 | 16 | 符号付き (1の補数) |
± 3.27 × 104 | -32767 〜 32767 |
| 符号付き (2の補数) |
-32768 〜 32767 | |||
| 符号なし | 0 〜 6.55 × 104 | 0 〜 65535 | ||
| 32 | 符号付き (1の補数) |
± 2.14 × 109 | -2,147,483,647 〜 2,147,483,647 | |
| 符号付き (2の補数) |
-2,147,483,648 〜 2,147,483,647 | |||
| 符号なし | 0 〜 4.29 × 109 | 0 〜 4,294,967,295 | ||
| 64 | 符号付き (1の補数) |
± 9.22 × 1018 | -9,223,372,036,854,775,807 〜 9,223,372,036,854,775,807 | |
| 符号付き (2の補数) |
-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 | |||
| 符号なし | 0 〜 1.84 × 1019 | 0 〜 18,446,744,073,709,551,615 | ||
| 浮動 小数 点数 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
| |
ノート: 実際の (保証されている最低限ではない) 限界はライブラリヘッダ <limits.h> および <float.h> で提供されます。
キーワード
char, int, short, long, signed, unsigned, float, double. _Bool, _Complex, _Imaginary
関連項目
基本型 の C++リファレンス
|