Cデータ型

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

Cプログラミング言語データタイプは、データ要素の格納の意味や特性を構成します。それらは、メモリ位置または変数の宣言の形式で言語構文で表現されます。データ型は、データ要素の操作の種類または処理方法も決定します。

C言語は、整数実数などの基本的な算術型と、配列型や複合型を構築するための構文を提供します。includeディレクティブを介して使用されるC標準ライブラリのヘッダーには、サポートタイプの定義が含まれ、特定のハードウェアプラットフォームでの言語実装に関係なく、正確なサイズのストレージを提供するなどの追加のプロパティがあります。[1] [2]

基本タイプ

主な種類

C言語は、4つの基本的な算術型指定子charintfloatdouble、および修飾子signedunsignedshortlongを提供します。次の表に、ストレージサイズ固有の宣言の大規模なセットを指定する際に許可される組み合わせを示します。

タイプ 説明 最小サイズ(ビット) フォーマット指定子 範囲定数 リテラル
char 基本的な文字セットを含めることができる、マシンのアドレス可能な最小単位。これは、ある整数タイプ。実際の型は、符号付きまたは符号なしのいずれかです。CHAR_BITビットが含まれています。[3] 8 %c
signed char charと同じサイズですが、署名が保証されています。少なくとも[-127、+ 127]の範囲を含むことができます。[3] [a] 8 %c (または%hhi数値出力用) SCHAR_MIN / SCHAR_MAX [5] -
unsigned char charと同じサイズですが、符号なしであることが保証されています。少なくとも[0、255]の範囲が含まれます。[6] 8 %c (または%hhu数値出力用) 0 / UCHAR_MAX -
short
short int
signed short
signed short int
短い符号付き整数型。少なくとも[-32,767、+ 32,767]の範囲を含めることができます。[3] [a] 16 %hi また %hd
unsigned short
unsigned short int
短い符号なし整数型。少なくとも[0、65,535]の範囲が含まれます。[3] 16 %hu SHRT_MIN / SHRT_MAX -
int
signed
signed int
基本的な符号付き整数型。少なくとも[-32,767、+ 32,767]の範囲を含めることができます。[3] [a] 16 %i また %d
unsigned
unsigned int
基本的な符号なし整数型。少なくとも[0、65,535]の範囲が含まれます。[3] 16 %u 0 / USHRT_MAX -
long
long int
signed long
signed long int
長い符号付き整数型。少なくとも[-2,147,483,647、+ 2,147,483,647]の範囲を含むことができます。[3] [a] 32 %li また %ld LONG_MIN / LONG_MAX lまたはL [7]
unsigned long
unsigned long int
長い符号なし整数型。少なくとも[0、4,294,967,295]の範囲を含むことができます。[3] 32 %lu 0 / ULONG_MAX uまたはU
long long
long long int
signed long long
signed long long int
長い長い符号付き整数型。少なくとも[-9,223,372,036,854,775,807、+ 9,223,372,036,854,775,807]の範囲を含むことができます。[3] [a]標準のC99バージョン以降に指定されています。 64 %lli また %lld LLONG_MIN / LLONG_MAX llまたはLL
unsigned long long
unsigned long long int
長い長い符号なし整数型。少なくとも[0、+ 18,446,744,073,709,551,615]の範囲が含まれます。[3]標準のC99バージョン以降に指定されています。 64 %llu ULLONG_MAX ll / LLとu / Uの両方
float 通常、単精度浮動小数点型と呼ばれる実際の浮動小数点型。実際のプロパティは指定されていません(最小制限を除く)。ただし、ほとんどのシステムでは、これはIEEE 754単精度バイナリ浮動小数点形式(32ビット)です。この形式は、オプションのAnnexF「IEC60559浮動小数点演算」で必要です。 テキストからの変換:[b]
  • %f %F
  • %g %G
  • %e %E
  • %a %A
double 通常、倍精度浮動小数点型と呼ばれる実際の浮動小数点型。実際のプロパティは指定されていません(最小制限を除く)。ただし、ほとんどのシステムでは、これはIEEE 754倍精度バイナリ浮動小数点形式(64ビット)です。この形式は、オプションのAnnexF「IEC60559浮動小数点演算」で必要です。
  • %lf %lF
  • %lg %lG
  • %le %lE
  • %la %lA[NS]
long double 通常、拡張精度の浮動小数点数形式にマップされる実際の浮動小数点型実際のプロパティは指定されていません。これはどちらかとすることができるのx86拡張精度浮動小数点形式(と、メモリに80ビット、典型的には96ビットまたは128ビットのパディングバイト非IEEE「)ダブルダブル」(128ビット)は、浮動IEEE 754 4倍精度-ポイント形式(128ビット)、またはdoubleと同じ。詳細については、ロングダブルの記事を参照してください。 %Lf %LF
%Lg %LG
%Le %LE
%La %LA[NS]
  1. ^ a b c d e 最小範囲-(2 n-1 -1)から2 n-1 -1([-127,127]など)は、標準で許可されているさまざまな整数表現(1の補数符号の大きさ)に由来します。2の補数)。[4]しかし、ほとんどのプラットフォームは、フォームの範囲意味、2の補数を使用-2 M-12 M-1 -1 MとN≥これらの実装のために、例えば[-128127(SCHAR_MIN = -128とSCHAR_MAX = 127)8ビットの符号付き文字の場合
  2. ^ これらのフォーマット文字列は、テキストへのフォーマット用にも存在しますが、doubleで動作します。
  3. ^ a b 大文字は、出力が小文字とは異なります。大文字の指定子は大文字で値を生成し、小文字で値を生成します(%A、%E、%F、%Gは大文字でINF、NAN、E(指数)などの値を生成します)

整数の実際のサイズは、実装によって異なります。この標準では、データ型と各データ型の最小サイズの間のサイズ関係のみが必要です。

関係の要件は、long longが、より小さくなくlong、より小さくintないことですshortこれは、より小さくありませんchar大きさは、常に最小のサポートされるデータタイプである、(以外に他のデータ型ビットフィールドが)小さくすることはできません。

最小サイズは、char8ビットの最小サイズであるshortintするために、16ビットでありlong、それは32ビットであり、long long少なくとも64ビットを含んでいなければなりません。

タイプは、intターゲットプロセッサは、最も効率的で作業していることを整数型でなければなりません。これにより、柔軟性が大幅に向上します。たとえば、すべてのタイプを64ビットにすることができます。ただし、いくつかの異なる整数幅スキーム(データモデル)が一般的です。データモデルはさまざまなプログラムの通信方法を定義するため、特定のオペレーティングシステムアプリケーションインターフェイス内で統一されたデータモデルが使用されます。[8]

実際にcharは通常8ビットのサイズでshortあり、通常は16ビットのサイズです(符号なしの対応物も同様です)。これは、1990年代のSunOS  4 Unix、Microsoft MS-DOS、最新のLinux、および組み込み8ビットPICマイクロコントローラー用のMicrochipMCC18などの多様なプラットフォームに当てはまりますPOSIXのcharサイズは正確に8ビットである必要があります。

C標準のmakeに様々なルールunsigned charのパディングビットとトラップ表現の欠如、の定義:任意の非ビット・フィールド・オブジェクトを格納するのに適したアレイに使用される基本型オブジェクト表現[6]及びエイリアシングの可能性。[9]

浮動小数点型の実際のサイズと動作も実装によって異なります。唯一の保証は、long doubleより小さくdoubleないことですfloatこれは、より小さくありません通常、32ビットおよび64ビットのIEEE754バイナリ浮動小数点形式が使用されます。

C99の標準は、新しい実浮動小数点型含みfloat_tdouble_tで定義されているが、<math.h>これらは、FLT_EVAL_METHODが0、1、または2の場合に浮動小数点式の中間結果に使用されるタイプに対応します。これらのタイプはlong doubleよりも幅が広い場合があります。

C99複合も追加しました、、float _Complexdouble _Complexlong double _Complex

ブール型

C99はブール(true / false)型を追加しました_Boolまた、<stdbool.h>ヘッダが定義されbool、このタイプのための便利なエイリアスとして、またためのマクロ提供trueとをfalse_Bool1つの例外を除いて、通常の整数型と同様に機能します_Bool。0(false)以外のaへの割り当ては、1(true)として格納されます。この動作は、暗黙的なナローイング変換での整数オーバーフローを回避するために存在します。たとえば、次のコードでは次のようになります。

unsigned char b = 256 ;    

if b {  
	/ *何かをする* /
}

サイズが8ビットのb場合、変数はfalseと評価されunsigned charます。これは、値256がデータ型に適合しないため、データ型の下位8ビットが使用され、値がゼロになるためです。ただし、タイプを変更すると、前のコードは正常に動作します。

_Bool b = 256 ;   

if b {  
	/ *何かをする* /
}

タイプ_Boolは、真の値が常に互いに等しく比較されることも保証します。

_Bool a = 1 b = 2 ;      

if a == b {    
	/ *何かをする* /
}

サイズとポインタの違いの種類

C言語仕様は、typedefのSメモリ関連の量を表すようにします。それらのサイズは、使用可能なアドレス空間などのメモリ機能ではなく、ターゲットプロセッサの算術機能に従って定義されます。これらのタイプは両方ともヘッダーで定義されていますC ++の場合)。 size_tptrdiff_t<stddef.h>cstddef

size_t特定の実装でオブジェクト(配列を含む)のサイズを表すために使用される符号なし整数型です。演算子sizeofは、タイプの値を生成しますの最大サイズはヘッダー(C ++のヘッダー)で定義されているマクロ定数を介して提供されます。少なくとも16ビット幅であることが保証されています。さらに、POSIXには、と同じ幅の符号付き整数型であるが含まれています。 size_tsize_tSIZE_MAX<stdint.h>cstdintsize_tssize_tsize_t

ptrdiff_tポインタ間の違いを表すために使用される符号付き整数型です。同じタイプのポインタに対してのみ有効であることが保証されています。異なるタイプで構成されるポインターの減算は、実装によって定義されます。

基本タイプのプロパティへのインターフェース

基本的な算術型のサイズなどの実際のプロパティに関する情報は、2つのヘッダーのマクロ定数を介して提供されます。<limits.h>ヘッダー(climitsC ++のヘッダー)は整数型のマクロを定義し、<float.h>ヘッダー(cfloatC ++のヘッダー)は浮動小数点型のマクロを定義します。 。実際の値は実装によって異なります。

整数型のプロパティ

  • CHAR_BIT –ビット単位のchar型のサイズ(少なくとも8ビット)
  • SCHAR_MINSHRT_MININT_MINLONG_MINLLONG_MIN(C99) -符号付き整数型の最小可能値:signed char型、短い署名され、署名されたint型、長い署名さは、長い長い署名され
  • SCHAR_MAXSHRT_MAXINT_MAXLONG_MAXLLONG_MAX(C99) -符号付き整数型の最大可能値:signed char型、短い署名され、署名されたint型、長い署名さは、長い長い署名され
  • UCHAR_MAXUSHRT_MAXUINT_MAXULONG_MAXULLONG_MAX(C99) -符号なし整数型の最大可能値:unsigned char型、unsigned short型、unsigned int型、unsigned long型、unsigned long型ロング
  • CHAR_MIN –charの可能な最小値
  • CHAR_MAX –charの可能な最大値
  • MB_LEN_MAX –マルチバイト文字の最大バイト数

浮動小数点型のプロパティ

  • FLT_MINDBL_MINLDBL_MIN-最小長い二重それぞれ、フロート、ダブルの正の値を正規化
  • FLT_TRUE_MINDBL_TRUE_MINLDBL_TRUE_MIN(C11) -フロートの最小の正の値、ダブル、長い二重それぞれ
  • FLT_MAXDBL_MAXLDBL_MAX-フロートの最大有限値、ダブル、ダブルロング、それぞれ
  • FLT_ROUNDS –浮動小数点演算の丸めモード
  • FLT_EVAL_METHOD (C99)–さまざまな浮動小数点型を含む式の評価方法
  • FLT_RADIX –浮動小数点型の指数の基数
  • FLT_DIGDBL_DIGLDBL_DIG-二重、それぞれ長い、二重、フロートによって精度を失うことなく表現することができる小数点以下の桁数
  • FLT_EPSILONDBL_EPSILONLDBL_EPSILON- 1.0と次の表現可能な値の間の差フロート、ダブル、長い二重、それぞれ
  • FLT_MANT_DIGDBL_MANT_DIGLDBL_MANT_DIG-多数のFLT_RADIXタイプの浮動小数点の仮数における-base数字は、それぞれ、二重、長い二重、フロート
  • FLT_MIN_EXPDBL_MIN_EXPLDBL_MIN_EXP-ような整数最小負FLT_RADIX電源一方に上昇少ないその数は長い二、それぞれ、二重、正規フロートよりも
  • FLT_MIN_10_EXPDBL_MIN_10_EXPLDBL_MIN_10_EXP-その乗10は、長い二重、それぞれ、二重、正規フロートであることを最小の負の整数このような
  • FLT_MAX_EXPDBL_MAX_EXPLDBL_MAX_EXP-ような整数最大の正FLT_RADIXのパワー一つに上げ少ないその数は長い二、それぞれ、二重、正規フロートよりも
  • FLT_MAX_10_EXPDBL_MAX_10_EXPLDBL_MAX_10_EXP-その乗10は、長い二重、それぞれ、二重、正規化浮動であるような整数で最大の正
  • DECIMAL_DIG(C99)–サポートされている最も広い浮動小数点型の任意の数を10進数でDECIMAL_DIG桁の精度で表し、値を変更せずに元の浮動小数点型で読み戻すことができる最小の10進数DECIMAL_DIG少なくとも10です。

固定幅整数型

C99標準では、プログラムの移植性を高めるために、いくつかの新しい整数型の定義が含まれています。[2]すでに利用可能な基本整数型は、実際のサイズが実装で定義されており、システムによって異なる可能性があるため、不十分であると見なされました。新しいタイプは、ハードウェアが通常複数のタイプのみをサポートし、サポートが環境によって異なる組み込み環境特に役立ちます。すべての新しいタイプは、で定義されている<inttypes.h>ヘッダ(cinttypesC ++ヘッダ)ともに利用可能である<stdint.h>ヘッダ(cstdintC ++ヘッダ)。タイプは、次のカテゴリにグループ化できます。

  • すべての実装で同じビットnを持つことが保証されている正確な幅の整数型実装で利用可能な場合にのみ含まれます。
  • 実装で使用可能な最小の型であることが保証され、少なくとも指定されたビットnを持つ最小幅の整数型少なくともN = 8,16,32,64で指定されることが保証されています。
  • 少なくとも指定されたビットnを持つ、実装で使用可能な最速の整数型であることが保証されている最速の整数型少なくともN = 8,16,32,64で指定されることが保証されています。
  • ポインターを保持できることが保証されているポインター整数型。実装で利用可能な場合にのみ含まれます。
  • 実装で最大の整数型であることが保証されている最大幅の整数型。

次の表は、実装の詳細を取得するためのタイプとインターフェイスをまとめたものです(nはビット数を示します)。

タイプカテゴリ 署名されたタイプ 符号なしタイプ
タイプ 最小値 最大値 タイプ 最小値 最大値
正確な幅 intn_t INTn_MIN INTn_MAX uintn_t 0 UINTn_MAX
最小幅 int_leastn_t INT_LEASTn_MIN INT_LEASTn_MAX uint_leastn_t 0 UINT_LEASTn_MAX
最速 int_fastn_t INT_FASTn_MIN INT_FASTn_MAX uint_fastn_t 0 UINT_FASTn_MAX
ポインタ intptr_t INTPTR_MIN INTPTR_MAX uintptr_t 0 UINTPTR_MAX
最大幅 intmax_t INTMAX_MIN INTMAX_MAX uintmax_t 0 UINTMAX_MAX

Printfおよびscanfフォーマット指定子

<inttypes.h>(ヘッダcinttypesC ++では)で定義されたタイプの機能強化機能を提供<stdint.h>ヘッダー。で定義されたタイプに対応するprintfフォーマット文字列およびscanfフォーマット文字列指定子のマクロ<stdint.h>と、intmax_tおよびuintmax_tタイプを操作するためのいくつかの関数を定義します。このヘッダーはC99で追加されました

Printfフォーマット文字列

マクロの形式はですここで、{fmt}は出力フォーマットを定義し、(10進数)、(16進数)、(8進数)、(符号なし)、および(整数)のいずれかです。{タイプ}は引数の型を定義し、の一つである、ここで、引数のビット数に対応します。 PRI{fmt}{type}dxouinFASTnLEASTnPTRMAXn

Scanf形式の文字列

マクロの形式はですここで、{fmt}は出力フォーマットを定義し、(10進数)、(16進数)、(8進数)、(符号なし)、および(整数)のいずれかです。{タイプ}は引数の型を定義し、の一つである、ここで、引数のビット数に対応します。 SCN{fmt}{type}dxouinFASTnLEASTnPTRMAXn

関数

追加の浮動小数点型

固定幅整数型と同様に、ISO / IEC TS 18661は、IEEE754交換および拡張形式の浮動小数点型を2進数および10進数で指定します。

  • _FloatN バイナリ交換フォーマットの場合。
  • _DecimalN 10進交換形式の場合。
  • _FloatNx バイナリ拡張フォーマットの場合。
  • _DecimalNx 10進拡張フォーマットの場合。

構造

構造体は、データ型が異なる可能性のある複数のデータ項目のストレージを、単一の変数によって参照される1つのメモリブロックに集約します。次の例struct birthdayでは、人の名前と誕生日を含むデータ型宣言しています構造体の定義の後にJohn、必要なストレージを割り当てる変数の宣言が続きます。

構造体の 誕生日{ 
	文字[ 20 ]; 
	int; 
	int; 
	int; 
};

構造体の 誕生日ジョン; 

構造体のメモリレイアウトは、プラットフォームごとの言語実装の問題ですが、いくつかの制限があります。最初のメンバーのメモリアドレスは、構造体自体のアドレスと同じである必要があります。構造体は、複合リテラルを使用して初期化または割り当てることができます関数は構造体を直接返す場合がありますが、これは実行時に効率的でないことがよくあります。C99以降、構造体は柔軟な配列メンバーで終わる場合もあります。

独自のタイプの構造体へのポインターを含む構造体は、リンクされたデータ構造を構築するために一般的に使用されます

構造体 ノード{ 
	int val ; 
	構造体 ノード*; 
};

配列

あらゆるタイプの場合Tを除き、無効と機能タイプ、種類が存在する「の配列N型の要素T配列は、すべて同じタイプの値のコレクションであり、メモリに連続して格納されます。サイズの配列は、Nから0までの整数でインデックス付けされますN−1簡単な例を次に示します。

int cat [ 10 ]; //それぞれがint型の10個の要素の配列   

配列は複合初期化子で初期化できますが、割り当てることはできません。配列は、最初の要素へのポインターを渡すことによって関数に渡されます。多次元配列は「配列の配列…」として定義され、最も外側の次元を除くすべてがコンパイル時の定数サイズである必要があります。

int a [ 10 ] [ 8 ]; // 10個の要素の配列、それぞれのタイプは「8個のint要素の配列」   

ポインタ

すべてのデータ型にTは、に対応する型ポインタがありTます。ポインタは、特定の型の変数の格納場所のアドレスを含むデータタイプです。これらは*、基本ストレージタイプに続き、変数名の前にアスタリスク()タイプの宣言子を使用して宣言されます。アスタリスクの前後の空白はオプションです。

char * square ; 
長い*; 
int *楕円形; 

ポインタはポインタデータ型に対して宣言することもできるため、配列型へのポインタを含む、char **int ***などの複数の間接ポインタを作成できます。後者はポインタの配列ほど一般的ではなく、それらの構文は混乱を招く可能性があります。

char * pc [ 10 ]; // 'ポインタからcharへの10個の要素の配列' char * pa )[ 10 ]; // charの10要素配列へのポインタ    
  

この要素にpcは、ポインタcharのサイズ(通常、一般的なプラットフォームでは40または80バイト)のメモリの10ブロックが必要ですが、要素paは1つのポインタ(サイズ4または8バイト)のみであり、参照するデータは10バイトの配列です。 ()。 sizeof *pa == 10

ユニオン

ユニオン型は型の記述の異なる選択肢を使用して、同じメモリブロックへのアクセスを許可する特殊な構造です。たとえば、データ型の和集合は、整数、浮動小数点数、またはその他のユーザー宣言型のいずれかとして同じデータを読み取ることができるように宣言できます。

ユニオン {
	int i ; 
	float f ; 
	構造体 {
		unsigned int u ;  
		ダブルd ; 
	} s ; 
} u ; 

合計サイズがuサイズであるu.s-のサイズの合計であることを起こるu.s.uu.s.d以来-sの両方よりも大きいifに何かを割り当てるときu.iよりも小さいu.f場合、の一部が保持される場合u.iがありu.fます。

ユニオンメンバーからの読み取りは、メンバーの値が変換されず、単に読み取られるため、キャストと同じではありません。

関数ポインタ

関数ポインタを使用すると、特定のシグネチャを持つ関数を参照できます。たとえば、標準関数のアドレスをabs変数に格納するにはmy_int_f

int * my_int_f )(int = abs ;   
//&演算子は省略できますが、ここでは「アドレス」absが使用されていることが明確になります

関数ポインタは、通常の関数呼び出しと同じように名前で呼び出されます。関数ポインタは、ポインタおよびvoidポインタとは別のものです。

型修飾子

前述の型は、型修飾子によってさらに特徴付けることができ修飾された型を生成します。 2014年C11の時点で、標準Cには4つの型修飾子があります:constC89)、volatileC89)、restrictC99)、_AtomicC11)–後者はユーザー名との衝突を避けるためにプライベート名を持っています[10]が、それ以上ヘッダーが含まatomicれている場合は、通常の名前を使用できます<stdatomic.h>。これらのうち、constこれは群を抜いて最もよく知られており、最も使用されており、標準ライブラリに表示され、C言語の重要な使用で遭遇します。const-correctness他の修飾子は低レベルプログラミングに使用され、そこで広く使用されていますが、一般的なプログラマーが使用することはめったにありません。[要出典]

も参照してください

参考文献

  1. ^ バー、マイケル(2007年12月2日)。「C言語のポータブル固定幅整数」取り出さ年1月18 2016
  2. ^ a b ISO / IEC 9899:1999仕様、TC3(PDF)NS。255、§7.18整数型<stdint.h>
  3. ^ a b c d e f g h i j ISO / IEC 9899:1999仕様、TC3(PDF)NS。22、§5.2.4.2.1整数型のサイズ<limits.h>
  4. ^ 国際標準の理論的根拠—プログラミング言語—Cリビジョン5.10(PDF)NS。25、§5.2.4.2.1整数型のサイズ<limits.h>
  5. ^ https://docs.microsoft.com/en-us/cpp/c-language/cpp-integer-limits?view = msvc-170 欠落または空|title=ヘルプ
  6. ^ a b ISO / IEC 9899:1999仕様、TC3(PDF)NS。37、§6.2.6.1タイプの表現–一般
  7. ^ https://en.cppreference.com/w/cpp/language/integer_literal 欠落または空|title=ヘルプ
  8. ^ 「64ビットプログラミングモデル:なぜLP64なのか?」オープングループ検索された9年11月2011
  9. ^ ISO / IEC 9899:1999仕様、TC3(PDF)NS。67、§6.5
  10. ^ C11:新しいC標準、トーマス・プラム