名前空間
変種
操作

算術型

From cppreference.com
< c‎ | language

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

目次

真偽型

  • _Bool (マクロboolとしてもアクセス可能)(C23まで)bool(C23以降)10 のいずれかの値を保持できる型 (マクロtruefalseとしてもアクセス可能)(C23まで)truefalse(C23以降)

なお、変換_Bool(C23まで)bool(C23以降)は他の整数型への変換とは異なる動作をします。(bool)0.5trueと評価されますが、(int)0.50と評価されます。

(C99以降)

[編集] 文字型

  • signed char — 符号付き文字表現のための型。
  • unsigned char — 符号なし文字表現のための型。また、オブジェクト表現(生メモリ)を検査するためにも使用されます。
  • char — 文字表現のための型。signed charまたはunsigned charのいずれかと等価ですが(どちらかは実装定義であり、コンパイラのコマンドラインスイッチによって制御される場合があります)、charsigned charともunsigned charとも異なる、独立した型です。

標準ライブラリは、ワイド文字を表現するためにtypedefwchar_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)
  • long long int (またはlong long)
  • unsigned long long int (またはunsigned long long)
(C99以降)
  • _BitInt(n) (またはsigned _BitInt(n))、ビット精度符号付き整数型 (ここでnは正確な幅(符号ビットを含む)を示す整数定数式で置き換えられ、<limits.h>BITINT_MAXWIDTHより大きくすることはできません)
  • unsigned _BitInt(n)、ビット精度符号なし整数型 (ここでnは正確な幅を示す整数定数式で置き換えられ、<limits.h>BITINT_MAXWIDTHより大きくすることはできません)
(C23以降)

注意:すべての型指定子と同様に、どのような順序でも許可されます。unsigned long long intlong 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 (intlong、およびポインタは32ビット);
  • Win32 API
  • UnixおよびUnix系システム (Linux, Mac OS X)

64ビットシステム

  • LLP64または4/4/8 (intlongは32ビット、ポインタは64ビット)
  • Win64 API
  • LP64または4/8/8 (intは32ビット、longとポインタは64ビット)
  • UnixおよびUnix系システム (Linux, Mac OS X)

他のモデルは非常に稀です。例えば、ILP64 (8/8/8: intlong、およびポインタは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 doubledoubleと同じ形式、つまりbinary64で実装しています)。
実装がマクロ定数__STDC_IEC_60559_DFP__を事前定義している場合、以下の10進浮動小数点型もサポートされます。
それ以外の場合、これらの10進浮動小数点型はサポートされません。
(C23以降)

浮動小数点型は特殊な値をサポートする場合があります。

  • 無限大 (正および負), INFINITYを参照
  • 負のゼロ-0.0。正のゼロと比較して等しいですが、特定の算術演算では意味を持ちます(例:1.0 / 0.0 == INFINITYですが、1.0 / -0.0 == -INFINITY
  • 非数 (NaN)。自身を含む何とも比較しても等しくなりません。複数のビットパターンがNaNを表します。nanNANを参照。CはシグナリングNaN(IEEE-754で規定)を特別に扱わず、すべてのNaNを静かなNaNとして扱います。

実浮動小数点数は、算術演算子+ - / * および<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__が定義されている場合、複素数型(およびライブラリヘッダ<complex.h>)は提供されません。

(C11 以降)

各複素数型は、対応する実数型(float complexにはfloatdouble complexにはdoublelong double complexにはlong double)の2要素からなる配列と同じオブジェクト表現およびアラインメント要件を持ちます。配列の最初の要素は実部を保持し、配列の2番目の要素は虚部を保持します。

float a[4] = {1, 2, 3, 4};
float complex z1, z2;
memcpy(&z1, a, sizeof z1); // z1 becomes 1.0 + 2.0i
memcpy(&z2, a+2, sizeof z2); // z2 becomes 3.0 + 4.0i

複素数は算術演算子+ - * および / と共に使用でき、虚数や実数と混合することも可能です。<complex.h>には複素数用に多くの数学関数が定義されています。組み込み演算子とライブラリ関数の両方で浮動小数点例外が発生し、math_errhandlingで説明されているようにerrnoが設定される場合があります。

インクリメントとデクリメントは複素数型には定義されていません。

関係演算子は複素数型には定義されていません(「より小さい」という概念がないため)。

複素数型と他の算術型の間には暗黙の型変換が定義されています。

複素数演算の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つの虚数型は

  • 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が定義されているかどうかを確認することを推奨しています。

(C11まで)

虚数は__STDC_IEC_559_COMPLEX__(C23まで)__STDC_IEC_60559_COMPLEX__(C23以降)が定義されている場合にサポートされます。

(C11 以降)

3つの虚数型それぞれは、その対応する実数型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のような分岐切断を持つライブラリ関数を扱う場合に意味を持つ、負のゼロ虚数成分を持つ数についても言えます。1.0 - 0.0*Iは、I_Complex_Iとして定義されている場合、正のゼロ虚数成分になります。負のゼロ虚数部にはCMPLXまたはconjの使用が必要です。

虚数型は実装も簡素化します。虚数型がサポートされている場合、虚数と複素数の乗算は、4回の乗算と2回の加算の代わりに、2回の乗算で直接実装できます。

(C99以降)

[編集] キーワード

[編集] 値の範囲

次の表は、一般的な数値表現の制限に関するリファレンスを提供します。

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
  • 最小サブノーマル
    ± 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
10進数
浮動小数点
32 IEEE-754
  • 最小サブノーマル
    ± 1 · 10-101
  • 最小ノーマル
    ± 1 · 10-95
  • max
    ± 9.999'999 · 1096
64 IEEE-754
  • 最小サブノーマル
    ± 1 · 10-398
  • 最小ノーマル
    ± 1 · 10-383
  • max
    ± 9.999'999'999'999'999 · 10384
128 IEEE-754
  • 最小サブノーマル
    ± 1 · 10-6176
  • 最小ノーマル
    ± 1 · 10-6143
  • max
    ± 9.999'999'999'999'999'999'
    999'999'999'999'999 · 106144
  1. オブジェクト表現は通常、32/64ビットプラットフォームではそれぞれ96/128ビットを占めます。

注: (保証された最小値とは対照的に)実際の範囲は、ライブラリヘッダ<limits.h><float.h>で利用できます。

[編集] 関連項目

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