C言語の基本データ型と派生データ型について解説します。
データ型 | サイズ | 最小値 | 最大値 |
---|---|---|---|
int | 16ビット | -32768 | 32767 |
32ビット | -2147483648 | 2147483647 | |
unsigned int | 16ビット | 0 | 65535 |
32ビット | 0 | 4294967295 | |
long | 32ビット | -2147483648 | 2147483647 |
64ビット | -9223372036854775808 | 9223372036854775807 | |
unsigned long | 32ビット | 0 | 65535 |
64ビット | 0 | 4294967295 | |
long long | 64ビット | -9223372036854775808 | 9223372036854775807 |
unsigned long long | 64ビット | 0 | 18446744073709551615 |
enum | 16ビットまたは32ビット | ||
float | 32ビット | -3.402823e+38 | 3.402823e+38 |
double | 64ビット | -1.797693e+308 | 1.797693e+308 |
long double | 環境依存 | ||
void | N/A | N/A | N/A |
C言語におけるcharは、8ビットの符号付き整数を表すデータ型である。とはいえ、数値を格納するために用いられることは少なく、文字を格納するために使われることが多い。
[signed] char
C言語の符号付き整数では、負(マイナス)の数を2の補数で表す。
2進数 | 10進数 | 備考 |
---|---|---|
00000000 | 0 | |
01111111 | 127 | 最大値 |
10000000 | -128 | 最小値 |
11111111 | -1 |
8ビットの符号付き整数を使用する例を以下に示す。
char add(char x, char y) {
char sum;
sum = x + y;
return sum;
}
shortは16ビットの符号付き整数を格納するためのデータ型である。
[signed] short [int]
2進数 | 10進数 | 備考 |
---|---|---|
0000000000000000 | 0 | |
0111111111111111 | 32767 | 最大値 |
1000000000000000 | -32768 | 最小値 |
1111111111111111 | -1 |
16ビットCPUが主流だった時代にはよく使われていたが、現在はあまり使われないデータ型である。
short intと記述することもできる。
short int m;
short n = 1024;
16ビットまたは32ビット符号付き整数型
[signed] int
int x;
signed int y = -1;
unsigned int z = 1;
int型で表せる最小値および最大値は処理系によって異なる。limits.h の INT_MIN マクロで最小値および最大値が定義されている。
マクロ | 説明 |
---|---|
INT_MIN | int型の最小値 |
INT_MAX | int型の最大値 |
32ビットまたは64ビット符号付き整数型
[signed] long [int]
long x;
signed long y = -1L;
unsigned long z = 1L;
long型で表せる最小値および最大値は処理系によって異なる。limits.h のマクロで、long型の最小値および最大値が定義されている。
マクロ | 説明 |
---|---|
LONG_MIN | long型の最小値 |
LONG_MAX | long型の最大値 |
long longは、64ビットの符号付き整数を表すデータ型である。
limits.h のマクロで、long long型で表せるの最小値および最大値が定義されている。
マクロ | 説明 |
---|---|
LLONG_MIN | long long型の最小値 |
LLONG_MAX | long long型の最大値 |
C言語におけるunsigned charは、8ビットの符号無し整数を表すデータ型である。
2進数 | 10進数 | 備考 |
---|---|---|
00000000 | 0 | 最小値 |
11111111 | 255 | 最大値 |
C言語におけるunsigned shortは、16ビットの符号無し整数を表すデータ型である。
2進数 | 10進数 | 備考 |
---|---|---|
0000000000000000 | 0 | 最小値 |
1111111111111111 | 65535 | 最大値 |
C言語におけるunsigned intは、16ビットまたは32ビットの符号無し整数を表すデータ型である。
unsigned int型で表せる最大値は処理系によって異なる。limits.h の UINT_MAX マクロで最大値が定義されている。
C言語におけるunsigned intは、32ビットまたは64ビットの符号無し整数を表すデータ型である。
unsigned long型で表せる最大値は処理系によって異なる。limits.h の ULONG_MAX マクロで最大値が定義されている。
マクロ | 説明 |
---|---|
ULONG_MAX | unsigned long型の最大値 |
unsigned long longは、64ビットの符号なし整数を表すデータ型である。
unsigned long long型で表せる最大値は処理系によって異なる。limits.h のマクロで、unsigned long long型の最大値が定義されている。
マクロ | 説明 |
---|---|
ULLONG_MAX | unsigned long long型の最大値 |
列挙型
C言語における float は、IEEE 754で規定されている単精度の浮動小数点数を表すデータ型である。
部 | ビット数 |
---|---|
符号部 | 1 bit |
指数部 | 8 bit |
仮数部 | 23 bit |
float 型では単精度浮動小数点演算ができます。
float f1, f2, f3;
f1 = f2 + f3;
旧仕様 (K&R) では次のような順番で演算されました。
しかし、ANSI ではすべて単精度で演算されます。
C言語における double は、IEEE 754で規定されている倍精度の浮動小数点数を表すデータ型である。
部 | ビット数 |
---|---|
符号部 | 1 bit |
指数部 | 11 bit |
仮数部 | 52 bit |
128ビット浮動小数点数型 (Solaris)
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
型のポインタへのポインタにすることはできません。
基本データ型の他にシステムコールやライブラリ関数で使用される派生データ型があります。 実際は何らかの基本データ型なのですが、移植性を高めるために別の名前が付けられています。
派生データ型はマクロで定義されているため、ヘッダーファイルをインクルードする必要があります。派生データ型によってインクルードするヘッダーファイルの名前は異なりますが、たいていの派生データ型は sys/types.h をインクルードすることで使用できるようになります。
派生データ型には、次のようなものがあります。
システムの時間をクロック刻み (clock tick) で表すデータ型
デバイス番号に使用されるデータ型
ファイルサイズとオフセット(先頭からの相対位置)用に使用されるデータ型
2つのポインタの減算結果を示す符号付き整数型
メモリー内のオブジェクトのサイズ(バイト単位)用に使用される型
バイト数またはエラーのどちらを返すこともある関数によって使用される符号付きサイズ型
秒単位の時間用に使用される型
ポインタを格納するために十分なサイズの符号付き整数型 (Solaris)
ポインタを格納するために十分なサイズの符号なし整数型 (Solaris)
精度が異なるデータ型の変数へ代入すれば、暗黙的に型変換される。
short a = 1;
int b = a;
型を明示して変換することもできる。これを「キャスト」と呼ぶ。
float f = 1.2;
double d = (double)f;
文字列をint型に変換するには、atoi関数を使う。
#include <stdlib.h>
int example(char *s) {
int i = atoi(s);
return i;
}
文字列をlong型に変換するには、atol関数を使う。
#include <stdlib.h>
long example(char *s) {
long l = atol(s);
return l;
}
文字列をdouble型に変換するには、atof関数を使う。
※float型ではないことに注意
#include <stdlib.h>
double example(char *s) {
double d = atof(s);
return d;
}
文字列をlong型の数値に変換する。
#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);
文字列をlong long型の数値に変換する。
#include <stdlib.h>
long long int strtoll(const char *nptr, char **endptr, int base);
文字列をunsigned long型の数値に変換する。
#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base);
文字列をunsigned long long型の数値に変換する。
#include <stdlib.h>
unsigned long long int strtoull(const char *nptr, char **endptr, int base);