char, int型
char型は文字を扱うための型です。実装されている文字セットの任意の文字を格納できるだけの大きさを持っています。文字以外の値もchar型の変数にセットできますが、値が符号つきになるかどうかは処理系に依存します。
char型を明示的に符号つきにするにはsigned charと宣言します。また、符号なしにするにはunsigned charと宣言します。
int型は整数を扱うための型です。整数型と呼ばれます。修飾子としてshortとlongをつけることができ、この時は一般的にintを省略します。intの大きさは特定のコンピュータに自然な大きさと決められていて、通常2バイトか4バイトです。shortは2バイト、longは4バイトが普通です。
しかし、C言語の仕様として定められているのは、shortとintは少なくとも16ビット、longは少なくとも32ビット、shortはint以下で、intはlong以下、ということだけです。正確な大きさを知るには、標準ヘッダのlimits.hを参照します。
short, int, longにも、修飾子signedとunsignedが使用できます。signedをつけると符号つきであることが明確になり、unsignedをつけると符号なしとなります。
float, double型
float型、double型、long double型は浮動小数型と呼ばれ、浮動小数点数を扱います。float型が単精度浮動小数点数、double型が倍精度浮動小数点数、long double型が拡張精度浮動小数点数となります。この3つの大きさは、処理系に依存します。全部同じこともあれば、異なることもあります。ただし、後側に書いてある型はより前方の型以上の大きさを必ず持ちます。正確な大きさを知るには標準ヘッダのfloat.hを参照します。
列挙型
列挙型は名前つきの整数定数を扱います。宣言方法は構造体と似ていて、enumというキーワードを使い、次のように宣言します。
enum タグ名 {定数名1, 定数名2, ...};
enum country { USA, UK, ITALY, CANADA,
GERMANY, JAPAN, FRANCE, RUSSIA };
上記の場合、USAには0が割り当てられ、UKは1、ITALYは2と以降1ずつ増えていきます。型はint型となります。
=を使って値の代入もできます。
enum country { USA = 100, UK, ITALY, CANADA,
GERMANY, JAPAN, FRANCE, RUSSIA };
上記の場合、USAには100が割り当てられ、UKは101、ITALYは102と以降1ずつ増えていきます。
enum country { USA, UK, ITALY, CANADA,
GERMANY=100, JAPAN, FRANCE, RUSSIA };
上記の場合、USAには0が割り当てられ、以降1ずつ増えていき、GERMANYが100、JAPANが101、と以降1ずつ増えていきます。
すべてに=で代入もできます。
enum country { USA=10, UK=20, ITALY=30, CANADA=40,
GERMANY=50, JAPAN=60, FRANCE=70, RUSSIA=80 };
列挙型の変数に他の整数の代入が許されるかはコンパイラによって異なります。たいていはワーニングを出します。
実際の列挙型の使用例を見てみましょう。ランダムに国を決定し、その国の正式名称を出力するプログラムです。列挙型を使うと、ソースコード中に列挙定数を書くことができるのでソースコードが見やすくなるという利点があります。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COUNTRY_NUM (8)
/* 列挙型の宣言 */
enum country { USA, UK, ITALY, CANADA,
GERMANY, JAPAN, FRANCE, RUSSIA };
int main (int argc, char **argv)
{
enum country c;
/* ランダムに国を選ぶ */
srand(time(NULL));
c = rand()%COUNTRY_NUM;
/* 正式名称を表示 */
switch(c) {
case USA:
printf("United States of America¥n");
break;
case UK:
printf("United Kingdom of Great Britain and Northern Ireland¥n");
break;
case ITALY:
printf("Italian Republic¥n");
break;
case CANADA:
printf("Canada¥n");
break;
case GERMANY:
printf("Federal Republic of Germany¥n");
break;
case JAPAN:
printf("Japan¥n");
break;
case FRANCE:
printf("French Republic¥n");
break;
case RUSSIA:
printf("Russian Federation¥n");
break;
}
return 0;
}
void型
void型は値を生成しない関数が返す型です。また、ポインタの型が決まっていない場合には、voidへのポインタが使用されます。
型の大きさについて
よくある質問で、それぞれの型の値の取り得る範囲を知りたいというものがあります。正確な値は標準ヘッダのlimits.hやfloat.hを参照しますが、下記のプログラムをコンパイル、実行すれば、お使いの開発環境での値の取りうる範囲を手軽に知ることができます。
<size.c 型別の最大・最小値を得る>
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main (int argc, char **argv)
{
printf("%s¥t%d¥n", "char型の最大値", CHAR_MAX);
printf("%s¥t%d¥n", "char型の最小値", CHAR_MIN);
printf("%s¥t%d¥n", "signed char型の最大値", SCHAR_MAX);
printf("%s¥t%d¥n", "signed char型の最小値", SCHAR_MIN);
printf("%s¥t%d¥n", "unsigned char型の最大値", UCHAR_MAX);
printf("%s¥t%d¥n", "short型の最大値", SHRT_MAX);
printf("%s¥t%d¥n", "short型の最小値", SHRT_MIN);
printf("%s¥t%d¥n", "unsigned short型の最大値", USHRT_MAX);
printf("%s¥t%d¥n", "int型の最大値", INT_MAX);
printf("%s¥t%d¥n", "int型の最小値", INT_MIN);
printf("%s¥t%u¥n", "unsigned int型の最大値", UINT_MAX);
printf("%s¥t%ld¥n", "long型の最大値", LONG_MAX);
printf("%s¥t%ld¥n", "long型の最小値", LONG_MIN);
printf("%s¥t%lu¥n", "unsigned long型の最大値", ULONG_MAX);
printf("%s¥t%g¥n", "float型の最大値", FLT_MAX);
printf("%s¥t%g¥n", "float型の正の値の最小値", FLT_MIN);
/* float型の最小値は-FLT_MAX */
printf("%s¥t%g¥n", "double型の最大値", DBL_MAX);
printf("%s¥t%g¥n", "double型の正の値の最小値", DBL_MIN);
/* double型の最小値は-DBL_MAX */
printf("%s¥t%Lg¥n", "long double型の最大値", LDBL_MAX);
printf("%s¥t%Lg¥n", "long double型の正の値の最小値", LDBL_MIN);
/* double型の最小値は-LDBL_MAX */
return 0;
}