名前空間
変種
操作

算術型

提供: cppreference.com
< c‎ | language

(型システムの概要についてはも参照してください。 C のライブラリによって提供されている型関連ユーティリティの一覧も参照してください。)

目次

ブーリアン型

  • _Bool (マクロ bool としてもアクセス可能です) ー 2つの値 1 および 0 (マクロ true および false としてもアクセス可能です) のいずれかを保持できる型。

_Bool への変換は他の整数型への変換と同じには動作しないことに注意してください。 (bool)0.51 に評価されるのに対して、 (int)0.50 に評価されます。

(C99以上)

[編集] 文字型

  • signed char ー 符号付き文字表現のための型。
  • unsigned char ー 符号なし文字表現のための型。 オブジェクト表現 (生のメモリ) を調べるためにも使用されます。
  • char ー 文字表現のための型。 signed char または unsigned char のいずれか (いずれであるかは処理系定義であり、コンパイラのコマンドラインオプションで制御できることもあります) と同等ですが、 charsigned char とも unsigned char とも異なる独立した型です。

標準ライブラリはワイド文字を表す typedefwchar_tchar16_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 としてもアクセスできます)
  • long long int (long long としてもアクセスできます)
  • unsigned long long int (unsigned long long としてもアクセスできます)
(C99以上)

ノート: 型指定子と同様に、任意の順序で記述できます。 unsigned long long intlong 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つの複素数型があります。

  • float _Complex (<complex.h> がインクルードされていれば float complex としても利用可能です)
  • double _Complex (<complex.h> がインクルードされていれば double complex としても利用可能です)
  • long double _Complex (<complex.h> がインクルードされていれば long double complex としても利用可能です)

ノート: 型指定子と同様に、任意の順序で記述できます。 long double complexcomplex long double、および double complex long でさえも、同じ型を表します。

#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
マクロ定数 __STDC_NO_COMPLEX__(C11) が処理系によって定義されている場合は、複素数型は提供されません (ライブラリヘッダ <complex.h> も同様です)。 (C11以上)

複素数型は、対応する実数型 (float complex の場合は floatdouble complex の場合は doublelong double complex の場合は long double) の要素を2つ持つ配列と同じオブジェクト表現およびアライメント要件を持ちます。 配列の第1要素は実部を保持し、第2要素は虚部を保持します。

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 を提供します (正確なルールについては算術演算子を参照してください)。

#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つの虚数型があります。

  • float _Imaginary (<complex.h> がインクルードされていれば float imaginary としても利用可能です)
  • double _Imaginary (<complex.h> がインクルードされていれば double imaginary としても利用可能です)
  • long double _Imaginary (<complex.h> がインクルードされていれば long double imaginary としても利用可能です)

ノート: 型指定子と同様に、任意の順序で記述できます。 long double imaginaryimaginary long double、および double imaginary long でさえも、同じ型を表します。

#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

__STDC_IEC_559_COMPLEX__ を定義するコンパイラは虚数をサポートすることが推奨されますが、必須ではありません。 POSIX は虚数のサポートを識別するためにマクロ _Imaginary_I が定義されているかどうかをチェックすることを推奨しています。

(C99以上)
(C11未満)

__STDC_IEC_559_COMPLEX__ が定義されていれば虚数はサポートされます。

(C11以上)

虚数型は、対応する実数型 (float imaginary の場合は floatdouble imaginary の場合は doublelong double imaginary の場合は long double) と同じオブジェクト表現およびアライメント要件を持ちます。

ノート: 虚数型は独立した型であり、対応する実数型と互換ではありません。 これはエイリアシングを禁止します。

虚数は算術演算子 + - * / で使用できます (複素数および実数と混ぜて演算しても構いません)。 <complex.h> で多くの虚数用の数学関数が定義されています。 組み込みの演算子とライブラリ関数はどちらも、 math_errhandling で説明されている通りに、浮動小数点例外を発生したり、 errno を設定したりすることがあります。

インクリメントおよびデクリメントは虚数型に対しては定義されません。

虚数型とそれ以外の算術型の間で暗黙の変換が定義されます。

虚数は自然な表記 x + I*y を用いてすべての複素数を表現することを可能にします (I_Imaginary_I として定義されている場合)。 虚数型がなければ一部の特殊な複素数の値を自然に作成することができません。 例えば、 I_Complex_I として定義されている場合、 0.0 + I*INFINITY と書くと実部が NaN になります (代わりに CMPLX(0.0, INFINITY) と書かなければなりません)。 虚部に負のゼロを持つ値についても同様です。 これは csqrt などの分岐切断を持つライブラリ関数を用いる時には意味を持ちます。 I_Complex_I として定義されている場合、 1.0 - 0.0*I は虚部が正のゼロになり、虚部を負のゼロにするには CMPLX または conj を使用しなければなりません。

虚数型は実装も単純化します。 虚数と複素数の乗算は、虚数がサポートされていれば、4回の乗算と2回の加算ではなく、2回の乗算でストレートに実装できます。

(C99以上)

[編集] 値の範囲

以下の表は一般的な数値表現の限界についてのリファレンスを提供します。 C 標準はどのような符号付き整数表現も認めているため、以下の表には保証されている最低限の要件 (1の補数に対応するもの) および最も一般的に使用されている実装の限界 (2の補数に対応するもの) の両方を掲載しています。 しかし、一般的なデータモデル (ILP32、 LP32、 LP64、 LLP64 など) はすべて、2の補数表現を使用しています。

ビット数 形式 値の範囲
概算値 正確な値
文字 8 符号付き
(1の補数)
-127127
符号付き
(2の補数)
-128127
符号なし 0255
整数 16 符号付き
(1の補数)
± 3.27 × 104 -3276732767
符号付き
(2の補数)
-3276832767
符号なし 06.55 × 104 065535
32 符号付き
(1の補数)
± 2.14 × 109 -2,147,483,6472,147,483,647
符号付き
(2の補数)
-2,147,483,6482,147,483,647
符号なし 04.29 × 109 04,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
符号なし 01.84 × 1019 018,446,744,073,709,551,615
浮動
小数
点数
32 IEEE-754
  • 最小の非正規化数:
    ± 1.401,298,4 × 10-45
  • 最小の正規化数:
    ± 1.175,494,3 × 10-38
  • 最大:
    ± 3.402,823,4 × 1038
  • 最小の非正規化数:
    ±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 × 10308
  • 最小の非正規化数:
    ±0x1p-1074
  • 最小の正規化数:
    ±0x1p-1022
  • 最大:
    ±0x1.fffffffffffffp+1023

ノート: 実際の (保証されている最低限ではない) 限界はライブラリヘッダ <limits.h> および <float.h> で提供されます。

[編集] キーワード

char, int, short, long, signed, unsigned, float, double. _Bool, _Complex, _Imaginary

[編集] 関連項目

基本型C++リファレンス