C言語のデータ型

C言語の基本データ型と派生データ型について解説します。

データ型の一覧

C言語のデータ型
データ型 サイズ 最小値 最大値
char 8ビット -128 127
unsigned char 8ビット 0 255
short 16ビット -32768 32767
unsigned short 16ビット 0 65535
int 16ビットまたは32ビット
long int 32ビットまたは64ビット
long 32ビットまたは64ビット
long long 64ビット
enum
float 32ビット
double 64ビット
long double
void N/A N/A N/A

char

C言語におけるcharは、8ビットの符号付き整数を表すデータ型である。

とはいえ、数値を格納するために用いられることは少なく、文字を格納するために使われることが多い。

char c;
char a[8];
char *p;

C言語の符号付き整数では、負(マイナス)の数を2の補数で表す。

char
2進数 10進数
00000000 0
01111111 127
10000000 -128
11111111 -1

short

shortは16ビットの符号付き整数を格納するためのデータ型である。

short
2進数 10進数
0000000000000000 0
0111111111111111 32767
1000000000000000 -32768
1111111111111111 -1

16ビットCPUが主流だった時代にはよく使われていたが、現在はあまり使われないデータ型である。

short intと記述することもできる。

short int m;
short n = 1024;

int

16ビットまたは32ビット符号付き整数型

int x;
signed int y = -1;
unsigned int z = 1;

int型で表せる最小値および最大値は処理系によって異なる。limits.h の INT_MIN マクロで最小値および最大値が定義されている。

limits.h
マクロ 説明
INT_MIN int型の最小値
INT_MAX int型の最大値

long int

32ビットまたは64ビット符号付き整数型

long

long intと同じ

long x;
signed long y = -1L;
unsigned long z = 1L;

long型で表せる最小値および最大値は処理系によって異なる。limits.h のマクロで、long型の最小値および最大値が定義されている。

limits.h
マクロ 説明
LONG_MIN long型の最小値
LONG_MAX long型の最大値

long long

long longは、64ビットの符号付き整数を表すデータ型である。

limits.h のマクロで、long long型で表せるの最小値および最大値が定義されている。

limits.h
マクロ 説明
LLONG_MIN long long型の最小値
LLONG_MAX long long型の最大値

unsigned char

C言語におけるunsigned charは、8ビットの符号無し整数を表すデータ型である。

unsigned char
2進数 10進数
00000000 0
11111111 255

unsigned short

C言語におけるunsigned shortは、16ビットの符号無し整数を表すデータ型である。

unsigned short
2進数 10進数
0000000000000000 0
1111111111111111 65535

unsigned int

C言語におけるunsigned intは、16ビットまたは32ビットの符号無し整数を表すデータ型である。

最大値

unsigned int型で表せる最大値は処理系によって異なる。limits.h の UINT_MAX マクロで最大値が定義されている。

unsigned long

C言語におけるunsigned intは、32ビットまたは64ビットの符号無し整数を表すデータ型である。

unsigned long型で表せる最大値は処理系によって異なる。limits.h の ULONG_MAX マクロで最大値が定義されている。

limits.h
マクロ 説明
ULONG_MAX unsigned long型の最大値

unsigned long long

unsigned long longは、64ビットの符号なし整数を表すデータ型である。

unsigned long long型で表せる最大値は処理系によって異なる。limits.h のマクロで、unsigned long long型の最大値が定義されている。

limits.h
マクロ 説明
ULLONG_MAX unsigned long long型の最大値

enum

列挙型

float

C言語における float は、IEEE 754で規定されている単精度の浮動小数点数を表すデータ型である。

IEEE 754 single precision
ビット数
符号部 1 bit
指数部 8 bit
仮数部 23 bit

float 型では単精度浮動小数点演算ができます。

float f1, f2, f3;
f1 = f2 + f3;

旧仕様 (K&R) では次のような順番で演算されました。

  1. 両オペランド(f2とf3)を倍精度化
  2. 倍精度(double型)で演算
  3. 倍精度の結果を単精度化
  4. 単精度の結果を f1 に格納

しかし、ANSI ではすべて単精度で演算されます。

double

C言語における double は、IEEE 754で規定されている倍精度の浮動小数点数を表すデータ型である。

IEEE 754 double precision
ビット数
符号部 1 bit
指数部 11 bit
仮数部 52 bit

long double

128ビット浮動小数点数型 (Solaris)

void

voidは引数または戻り値が無いことを表す特殊なデータ型です。たとえば、引数を取らない関数は次のように定義します。

int getchar(void);

戻り値を返さない関数は次のように定義します。

void exit(int status);

void * は汎用の(型に依存しない)ポインタ型を表します。たとえば、汎用のポインタ型を引数に取る関数は次のように定義します。

void free(void *ptr);

汎用のポインタ型を返す関数は次のように定義します。

void *malloc(size_t size);

汎用型ポインタは型を特定することができないため、ポインタが指し示す値を直接参照することができません。他のポインタ型に変換してから参照します。

void *p;
int *i;

p = malloc(sizeof(int));
*p = 0; /* NG */
i = p;
*i = 0; /* OK */

void ** のようにvoid型のポインタへのポインタにすることはできません。

C言語の派生データ型

基本データ型の他にシステムコールやライブラリ関数で使用される派生データ型があります。 実際は何らかの基本データ型なのですが、移植性を高めるために別の名前が付けられています。

派生データ型はマクロで定義されているため、ヘッダーファイルをインクルードする必要があります。派生データ型によってインクルードするヘッダーファイルの名前は異なりますが、たいていの派生データ型は sys/types.h をインクルードすることで使用できるようになります。

派生データ型には、次のようなものがあります。

clock_t

システムの時間をクロック刻み (clock tick) で表すデータ型

dev_t

デバイス番号に使用されるデータ型

off_t

ファイルサイズとオフセット(先頭からの相対位置)用に使用されるデータ型

ptrdiff_t

2つのポインタの減算結果を示す符号付き整数型

size_t

メモリー内のオブジェクトのサイズ(バイト単位)用に使用される型

ssize_t

バイト数またはエラーのどちらを返すこともある関数によって使用される符号付きサイズ型

time_t

秒単位の時間用に使用される型

intptr_t

ポインタを格納するために十分なサイズの符号付き整数型 (Solaris)

uintptr_t

ポインタを格納するために十分なサイズの符号なし整数型 (Solaris)

暗黙的な変換

精度が異なるデータ型の変数へ代入すれば、暗黙的に型変換される。

short a = 1;
int b = a;

明示的な型変換

型を明示して変換することもできる。これを「キャスト」と呼ぶ。

float f = 1.2;
double d = (double)f;

atoi

文字列をint型に変換するには、atoi関数を使う。

#include <stdlib.h>

int example(char *s) {
  int i = atoi(s);
  return i;
}

atol

文字列をlong型に変換するには、atol関数を使う。

#include <stdlib.h>

long example(char *s) {
  long l = atol(s);
  return l;
}

atof

文字列をdouble型に変換するには、atof関数を使う。

※float型ではないことに注意

#include <stdlib.h>

double example(char *s) {
  double d = atof(s);
  return d;
}

strtol

文字列をlong型の数値に変換する。

#include <stdlib.h>

long int strtol(const char *nptr, char **endptr, int base);

strtoll

文字列をlong long型の数値に変換する。

#include <stdlib.h>

long long int strtoll(const char *nptr, char **endptr, int base);

strtoul

文字列をunsigned long型の数値に変換する。

#include <stdlib.h>

unsigned long int strtoul(const char *nptr, char **endptr, int base);

strtoull

文字列をunsigned long long型の数値に変換する。

#include <stdlib.h>

unsigned long long int strtoull(const char *nptr, char **endptr, int base);