Arithmetic types
(関連項目: type 型システムの概要と、 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以降) をワイド文字を表すために定義している ことに加え、 char8_t をUTF-8文字用に定義している (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
|
||||||
|
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
|
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
(C99) |
少なくとも
64 |
64 | 64 | 64 | 64 |
|
long
long
int
|
||||||
|
signed
long
long
|
||||||
|
signed
long
long
int
|
||||||
|
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 ) .
注: これは、 byte が64ビットでサイズされ、すべての型( char を含む)が64ビット幅であり、 sizeof がすべての型に対して 1 を返すような極端なケースを許容します。
注記: 符号付き整数型と符号なし整数型では整数演算の定義が異なります。 arithmetic operators を参照してください。特に integer overflows の項をご覧ください。
データモデル
各実装が基本型のサイズについて行う選択は、総称して データモデル として知られています。広く受け入れられた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をクワイエットとして扱うことに注意。
実数浮動小数点数は、
算術演算子
+
-
/
*
および
<math.h>
の各種数学関数と共に使用できます。組み込み演算子とライブラリ関数の両方が浮動小数点例外を発生させ、
errno
を設定する可能性があります。詳細は
math_errhandling
で説明されています。
浮動小数点式は、その型で示される範囲と精度を超える可能性があります。詳細は FLT_EVAL_METHOD を参照してください。 代入 、 return 、および cast によって、範囲と精度は宣言された型に関連付けられた値に強制されます。
浮動小数点式はまた、 縮約 される場合があります。つまり、すべての中間値が無限の範囲と精度を持つかのように計算されることを意味します。詳細は #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
各複素数型は、対応する実数型の要素2つからなる 配列 と同じ オブジェクト表現 と アライメント要件 を持ちます( float は float complex 、 double は double complex 、 long double は long double complex に対応)。配列の最初の要素は実部を保持し、2番目の要素は虚部を保持します。
複素数は
算術演算子
インクリメントおよびデクリメントは複素数型に対して定義されていません。 複素数型には関係演算子は定義されていません(「より小さい」という概念が存在しないため)。
複素数演算の無限大一元モデルをサポートするため、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); // 教科書の公式では以下のようになる // (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN // しかしC言語では複素無限大が得られる printf("%f%+f*i\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%+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 に対して float imaginary 、 double に対して double imaginary 、 long double に対して long double imaginary )と同じ オブジェクト表現 と アライメント要件 を持ちます。 注記: それにもかかわらず、虚数型は区別され、 対応する実数型と互換性がありません 。これによりエイリアシングは禁止されます。
虚数は
算術演算子
インクリメントおよびデクリメントは虚数型に対して定義されていません。
虚数型を使用することで、すべての複素数を自然な表記法 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 .
タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しています。このページには翻訳対象となる通常のテキストが含まれていないため、翻訳結果は原文と同一になります)
値の範囲
以下の表は、一般的な数値表現の制限に関するリファレンスを示しています。
C23以前、C標準は任意の符号付き整数表現を許可しており、Nビット符号付き整数の保証される最小範囲は
-(2
N-1
-1)
から
+2
N-1
-1
まで(例:8ビット符号付き型の場合
-127
から
127
)であり、これは
1の補数
または
符号と絶対値表現
の限界値に対応する。
しかし、すべての一般的なデータモデル(ILP32、LP32、LP64、LLP64を含む)およびほぼすべてのCコンパイラは
2の補数
表現を使用しており(既知の例外はUNISYS向けの一部コンパイラのみ)、C23以降では標準で許可される唯一の表現となり、保証される範囲は
-2
N-1
から
+2
N-1
-1
まで(例:8ビット符号付き型の場合
-128
から
127
)。
| 型 | ビットサイズ | フォーマット | 値の範囲 | |
|---|---|---|---|---|
| 概算 | 正確な値 | |||
| 文字型 | 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 |
|
|
|
|
10進
浮動小数 点 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
||
| 128 | IEEE-754 |
|
||
- ↑ オブジェクト表現は通常、32ビット/64ビットプラットフォームでそれぞれ96/128ビットを占有します。
注意: 保証された最小範囲ではなく実際の範囲は、ライブラリヘッダー <limits.h> および <float.h> で利用可能です。
関連項目
|
C++ ドキュメント
for
基本型
|