Namespaces
Variants

Arithmetic types

From cppreference.net

(関連項目: type 型システムの概要と、 Cライブラリが提供する型関連ユーティリティの一覧 )

目次

ブーリアン型

  • _Bool (マクロ bool としてもアクセス可能) (C23まで) bool (C23以降) — 2つの値のいずれかを保持できる型: 1 0 (マクロ true false としてもアクセス可能) (C23まで) true false (C23以降)

注意点: 変換 _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 としてもアクセス可能)
  • 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 int long int unsigned long は同じ型を表します。

以下の表は、利用可能なすべての整数型とそのプロパティをまとめたものです:

**翻訳結果:** - HTMLタグ、属性、` `内のC++キーワード(`signed char`)は翻訳せず、元のまま保持されています - テキスト部分はC++の専門用語であるため、日本語への翻訳は行われていません - 元のフォーマットと構造は完全に維持されています **注記:** `signed char`はC++のデータ型を表す専門用語であり、日本語では通常「符号付き文字型」と訳されますが、ご指示に従って原文のまま保持しました。 **翻訳結果:** - HTMLタグ、属性、および` `内のC++キーワード(`unsigned char`)は翻訳せず、元のフォーマットを保持しました。 - テキスト部分は存在しないため、翻訳対象はありません。 **注記:** - 指定された条件に従い、C++の専門用語(`unsigned char`)は翻訳対象外としました。 - HTML構造と書式は完全に保持されています。 **説明:** - HTMLタグ、属性、クラス名はすべて原文のまま保持されています - ` ` 内のC++キーワード「short int」は翻訳対象外として保持されています - 書式設定と構造は完全に維持されています - C++専門用語は翻訳せず、そのまま残しています **翻訳結果:** **説明:** - HTMLタグと属性はすべて保持されています - ` `タグ内のテキストはC++のキーワードであるため、翻訳対象外としました - `signed`と`short`はC++のデータ型指定子であり、専門用語として翻訳していません - 元のフォーマットと構造は完全に保持されています **説明:** - HTMLタグ、属性、および` `内のC++キーワード(signed, short, int)は翻訳対象外です - C++の型指定子は専門用語として原文のまま保持されています - 書式と構造は完全に維持されています **注記**: このHTMLフラグメントには翻訳すべき自然言語テキストが含まれていません。すべてのテキスト内容はC++のキーワード(`unsigned`、`short`、`int`)であり、これらはC++の専門用語として翻訳対象外です。HTMLタグと属性、および` `内のコードもすべて保持されています。 HTMLタグ、属性、およびC++固有の用語(`unsigned`、`short`、`int`)は翻訳せず、元のフォーマットを保持しました。 **説明:** - HTMLタグと属性はすべてそのまま保持されています - ` ` タグ内のテキストはC++のキーワードであるため、翻訳せずに保持されています - 「signed」はC++の型修飾子であり、専門用語として翻訳対象外としています - 元のフォーマットと構造は完全に維持されています **説明:** - HTMLタグ、属性、および` `内のC++キーワード(`signed`、`int`)は翻訳対象外です - 書式設定と構造は完全に保持されています - C++専門用語は原文のまま維持されています **翻訳結果:** **説明:** - ` `タグ内のC++キーワード「unsigned」と「int」は翻訳対象外として保持 - HTMLタグと属性は完全に保持 - 書式と構造は完全に維持 - C++専門用語は原文のまま保持 **説明:** - HTMLタグ、属性、クラス名はすべて元のまま保持されています - ` `内のC++コード(`unsigned int`)は翻訳対象外としてそのまま残しています - フォーマットと構造は完全に維持されています **説明:** - HTMLタグと属性はすべて保持されています - ` `内のC++コードは翻訳対象外のため、`long int`はそのまま保持されています - 元のフォーマットと構造が完全に維持されています - C++の専門用語(`long int`)は翻訳されていません HTMLタグ、属性、 タグ内のテキスト、C++固有の用語は翻訳せず、元のフォーマットを保持しました。 **翻訳結果:** **説明:** - HTMLタグ、属性、および` `内のC++キーワード(`signed`、`long`、`int`)は翻訳対象外です - C++の専門用語は原文のまま保持されています - 書式設定は完全に維持されています **注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。すべてのコンテンツは以下のいずれかに該当します: - HTMLタグと属性(翻訳対象外) - ` `タグ内のC++キーワード(翻訳対象外) - C++固有の用語(`unsigned`、`long`、`int`は翻訳対象外) したがって、元のフォーマットとコンテンツは完全に保持されています。 **説明:** - HTMLタグ、属性、CSSスタイルはそのまま保持されています - ` ` タグ内のC++キーワード(unsigned, long, int)は翻訳対象外として保持されています - 元のフォーマットとインデントが完全に維持されています **翻訳結果:** - HTMLタグ、属性、 タグ内のC++キーワード(long long int)は翻訳せず、元のまま保持されています - コード内のC++固有の用語は翻訳対象外です - 元のフォーマットと構造は完全に維持されています (注:この例では翻訳すべき自然言語テキストが含まれていないため、出力は入力と同一になります) **説明:** - HTMLタグ、属性、クラス名はすべて原文のまま保持されています - ` ` 内のC++キーワード(signed long long)は翻訳対象外のため、原文のままです - 書式設定と構造は完全に維持されています - C++の専門用語は翻訳せず、そのまま保持しています **翻訳結果:** **説明:** - HTMLタグ、属性、CSSスタイルはすべて保持されています - ` `内のC++キーワード(signed, long, long, int)は翻訳対象外のため保持されています - C++固有の用語は翻訳せず、元のまま維持しています **翻訳結果:** HTMLタグ、属性、C++固有の用語(`unsigned`、`long`、`int`)、および` `タグ内のテキストは翻訳せず、元のフォーマットを保持しました。`(C99)`はC++の仕様を示すため、翻訳対象外としています。
型指定子 等価な型 データモデルによるビット幅
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 で実装しています)。
実装がマクロ定数 __STDC_IEC_60559_DFP__ を事前定義している場合、以下の十進浮動小数点型もサポートされます。
それ以外の場合、これらの十進浮動小数点型はサポートされません。
(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つの複合型は以下の通りです

  • float _Complex <complex.h> がインクルードされている場合は float complex としても利用可能)
  • double _Complex <complex.h> がインクルードされている場合は double complex としても利用可能)
  • long double _Complex <complex.h> がインクルードされている場合は long double complex としても利用可能)

注: すべての型指定子と同様に、任意の順序が許可されます: long double complex , complex 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以降)

各複素数型は、対応する実数型の要素2つからなる 配列 と同じ オブジェクト表現 アライメント要件 を持ちます( float float complex double double complex long double long double complex に対応)。配列の最初の要素は実部を保持し、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> には複素数のために定義された多くの数学関数があります。組み込み演算子とライブラリ関数の両方が、浮動小数点例外を発生させ、 errno を設定する可能性があり、その動作は math_errhandling で説明されている通りです。

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

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

暗黙の変換 are defined between complex types and other arithmetic types.

複素数演算の無限大一元モデルをサポートするため、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つの虚数型は以下の通りです。

  • float _Imaginary (また float imaginary として利用可能 - <complex.h> がインクルードされている場合)
  • double _Imaginary (また double imaginary として利用可能 - <complex.h> がインクルードされている場合)
  • long double _Imaginary (また long double imaginary として利用可能 - <complex.h> がインクルードされている場合)

注記: 全ての型指定子と同様に、任意の順序が許可されます: long double imaginary , imaginary 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 に対して float imaginary double に対して double imaginary long double に対して long double imaginary )と同じ オブジェクト表現 アライメント要件 を持ちます。

注記: それにもかかわらず、虚数型は区別され、 対応する実数型と互換性がありません 。これによりエイリアシングは禁止されます。

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

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

暗黙の変換 are defined between imaginary types and other arithmetic types.

虚数型を使用することで、すべての複素数を自然な表記法 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以降)

キーワード

(注:指定された要件により、HTMLタグ・属性、 タグ内のテキスト、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
  • 最小サブノーマル:
    ± 1.401,298,4 · 10 −45
  • 最小ノーマル:
    ± 1.175,494,3 · 10 −38
  • 最大:
    ± 3.402,823,4 · 10 38
  • 最小サブノーマル:
    ±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 · 10 308
  • 最小サブノーマル:
    ±0x1p−1074
  • 最小ノーマル:
    ±0x1p−1022
  • 最大:
    ±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
  • 最大:
    ± 1.189,731,495,357,231,765,021
    · 10 4932
  • 最小サブノーマル:
    ±0x1p−16445
  • 最小ノーマル:
    ±0x1p−16382
  • 最大:
    ±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
  • 最大:
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 10 4932
  • 最小サブノーマル:
    ±0x1p−16494
  • 最小ノーマル:
    ±0x1p−16382
  • 最大:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
10進
浮動小数
32 IEEE-754
  • 最小サブノーマル:
    ± 1 · 10 -101
  • 最小ノーマル:
    ± 1 · 10 -95
  • 最大:
    ± 9.999'999 · 10 96
64 IEEE-754
  • 最小サブノーマル:
    ± 1 · 10 -398
  • 最小ノーマル:
    ± 1 · 10 -383
  • 最大:
    ± 9.999'999'999'999'999 · 10 384
128 IEEE-754
  • 最小サブノーマル:
    ± 1 · 10 -6176
  • 最小ノーマル:
    ± 1 · 10 -6143
  • 最大:
    ± 9.999'999'999'999'999'999'
    999'999'999'999'999 · 10 6144
  1. オブジェクト表現は通常、32ビット/64ビットプラットフォームでそれぞれ96/128ビットを占有します。

注意: 保証された最小範囲ではなく実際の範囲は、ライブラリヘッダー <limits.h> および <float.h> で利用可能です。

関連項目