C データ型

C 言語において、データ型とは、さまざまな型の変数や関数を宣言するための広範なシステムを指します。変数の型は、変数の格納に必要なスペースと、格納されたビットパターンの解釈方法を決定します。

C の型は、以下のように分類できます。

番号型と説明
1基本データ型
これらは算術型であり、整数型(int)、文字型(char)、浮動小数点型(float)、倍精度浮動小数点型(double)を含みます。
2列挙型:
これらも算術型であり、プログラム内で特定の離散的な整数値のみを割り当てられる変数を定義するために使用されます。
3void 型:
型指定子void値を持たないデータ型を表し、通常は関数の戻り値に使用されます。
4派生型:
配列型、ポインタ型、構造体型を含みます。

配列型と構造体型は総称して集約型と呼ばれます。関数の型は関数の戻り値の型を指します。この章の以降の部分では基本型を紹介し、他のいくつかの型については後続の章で説明します。

整数型

次の表に、標準の整数型のストレージサイズと値の範囲の詳細を示します。

型ストレージサイズ値の範囲
char1 バイト-128 から 127、または 0 から 255
unsigned char1 バイト0 から 255
signed char1 バイト-128 から 127
int2 または 4 バイト-32,768 から 32,767、または -2,147,483,648 から 2,147,483,647
unsigned int2 または 4 バイト0 から 65,535、または 0 から 4,294,967,295
short2 バイト-32,768 から 32,767
unsigned short2 バイト0 から 65,535
long4 バイト-2,147,483,648 から 2,147,483,647
unsigned long4 バイト0 から 4,294,967,295

注意:各種型のストレージサイズはシステムのビット数に関係しますが、現在一般的に使用されているのは64ビットシステムが主流です。

以下に、32ビットシステムと64ビットシステムのストレージサイズの違いを示します(Windows も同じです):

特定のプラットフォームにおける型または変数の正確なサイズを取得するには、次を使用できますsizeof演算子。式sizeof(type)オブジェクトまたは型のストレージサイズ(バイト数)を取得します。次の例は、int 型のサイズを取得する方法を示しています。

例

#include <stdio.h> #include <limits.h> int main() { printf("int ストレージサイズ : %lu\n", sizeof(int)); return 0; }

%luは 32 ビットの符号なし整数です。詳細は次を参照してください。C ライブラリ関数 - printf()。

Linux で上記のプログラムをコンパイルして実行すると、次の結果が得られます。

int 存储大小 : 4 

浮動小数点型

次の表に、標準の浮動小数点型のストレージサイズ、値の範囲、精度の詳細を示します。

型ストレージサイズ値の範囲精度
float4 バイト1.2E-38 から 3.4E+38有効桁数 6 桁
double8 バイト2.3E-308 から 1.7E+308有効桁数 15 桁
long double16 バイト3.4E-4932 から 1.1E+4932有効桁数 19 桁

ヘッダーファイル float.h はマクロを定義しており、プログラム内でこれらの値や実数のバイナリ表現に関するその他の詳細を使用できます。次の例は、浮動小数点型が使用するストレージスペースとその範囲の値を出力します。

例

#include <stdio.h> #include <float.h> int main() { printf("float ストレージ最大バイト数 : %lu\n", sizeof(float)); printf("float 最小値: %E\n", FLT_MIN ); printf("float 最大値: %E\n", FLT_MAX ); printf("精度の値: %d\n", FLT_DIG ); return 0; }

%Eは、単精度・倍精度の実数を指数形式で出力するためのものです。詳細は次を参照してください。C ライブラリ関数 - printf()。

Linux で上記のプログラムをコンパイルして実行すると、次の結果が得られます。

float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

void 型

void 型は、利用可能な値がないことを指定します。通常、以下の3つの場合に使用されます。

番号型と説明
1関数の戻り値が空
C には、値を返さないさまざまな関数があります。つまり、空を返すと言えます。値を返さない関数の戻り値の型は空です。例:void exit (int status);
2関数の引数が空
C には、引数を受け取らないさまざまな関数があります。引数なしの関数は void を受け取ることができます。例:int rand(void);
3void を指すポインタ
void * 型のポインタはオブジェクトのアドレスを表し、型ではありません。例えば、メモリ割り当て関数void *malloc( size_t size );は void を指すポインタを返し、任意のデータ型に変換できます。

今は void 型を完全に理解できなくても心配する必要はありません。後の章でこれらの概念について詳しく説明します。


型変換

型変換とは、あるデータ型の値を別のデータ型の値に変換することです。

C 言語には2種類の型変換があります。

  • 暗黙の型変換:暗黙の型変換は、式の中で自動的に行われ、明示的な指示や関数呼び出しを必要としません。通常は、小さい型をより大きい型に自動的に変換します。例えば、int 型を long 型に、または float 型を double 型に変換します。暗黙の型変換は、データの精度の喪失やデータの切り捨てを引き起こす可能性もあります。

  • 明示的な型変換:明示的な型変換では、キャスト演算子(type casting operator)を使用する必要があります。これにより、あるデータ型の値を別のデータ型の値に強制的に変換できます。キャストを使用すると、必要に応じてデータ型をより精密に制御できますが、データの喪失や切り捨てを引き起こす可能性もあります。

暗黙の型変換の例:

例

int i = 10;
float f = 3.14;
double d = i + f; // 暗黙的にint型をdouble型に変換

明示的な型変換の例:

例

double d = 3.14159;
int i = (int)d; // 明示的にdouble型をint型に変換
その他の拡張