今回は前回に少しだけ触れた型について勉強していこうと思います。その過程で配列の知識も必要になってくるので配列についても抑えていきましょう。
前回の復習
型にはどんな種類があったのかおさらいしておきましょう。下の表を見てください。
型名 | 意味 |
---|---|
int | 整数型 |
double | 浮動小数点数型(8バイト) |
float | 浮動小数点数型(4バイト) |
char | 文字型 |
void | 型なし |
ではそれぞれの型について確認していきましょう。
int型
int型とは、整数を扱うための型で、サイズは4バイトです。バイトというのは情報量の単位のことで1バイト=8ビットとなります。ビットも同じく情報量の単位のことなのですが、こちらは最小単位となります。コンピュータは0と1の二つの値を組み合わせて情報を扱う(=2進数)ので、1ビットとは取り扱っているデータの一桁目が”0″か”1″かを表現していると思ってください。以下の表で2進数の3ビットで表現できる数字を確認しましょう。
ビット表現 (2進数) |
普段扱う数字 (10進数) |
ビット表現 (2進数) |
普段扱う数字 (10進数) |
---|---|---|---|
0 | 0 | 100 | 4 |
1 | 1 | 101 | 5 |
10 | 2 | 110 | 6 |
11 | 3 | 111 | 7 |
表からもわかるように3ビット(3桁)で0〜7の8個(23個)の数字を表現することができます。
nビットで表現できる数字の数は2n個で表現できる範囲の数字は0〜2n−1ということです。
***説明のため正の数に限定していますが負の数が入ってくると表現できる範囲は変わることに注意しましょう***では4バイトのとき表現できる数字の数と範囲について考えてみてください。
4バイト = 4 × 8 ビット より
数字の数:232個
範囲:0〜232−1
では二つのint型の数字の平均を計算するプログラムを作成してみましょう。
/***
filename:average.c
***/
#include<stdio.h>
int main(void)
{
int num1,num2;
printf("一つ目の数字を入力してください:");
scanf("%d",&num1);
printf("二つ目の数字を入力してください:");
scanf("%d",&num2);
printf("ふたつの値の平均は %d です\n", (num1+num2)/2);
return 0;
}
二つ目の数字を入力してください:11
ふたつの値の平均は 17 です

(24+11)/2=17.5だよね?
鋭い指摘ですね。int型では小数部は切り捨てられます。そこで次に浮動小数点数を扱えるdoubleとfloatについて学んでいきましょう。
double(float)型
double(float)型について理解するために上のプログラムを改変した下のプログラムを作ってみましょう。
/***
filename:average_double.c
***/
#include<stdio.h>
int main(void)
{
int num1,num2;
double ans_d;
float ans_f;
printf("一つ目の数字を入力してください:");
scanf("%d",&num1);
printf("二つ目の数字を入力してください:");
scanf("%d",&num2);
ans_d = num1 + num2; //ans_d = (num1+num2)/2; としないことに注意
ans_d = ans_d/2;
ans_f = num1 + num2;
ans_f = ans_f/2;
puts("ふたつの値の平均は");
printf(" double型ans:%f\n", ans_d);
printf(" float型ans:%f\n", ans_f);
printf(" キャスト:%.1f\n", (double)(num1 + num2) / 2); //(num1+num2)をdouble型にキャスト
puts("です");
return 0;
}
二つ目の数字を入力してください:11
ふたつの値の平均は
double型ans:17.500000
float型ans:17.500000
キャスト:17.5
です
実行結果からもわかるようにdoubleとfloatでは小数を扱えるということにおいて違いはありません。両者の違いは扱える範囲で、double型の方が広い範囲を扱えるよくらいの認識で大丈夫です。
ソースコードの説明
double型をprintfで出力するためには、変数指定フォーマットは%fとする必要があります。この時小数第6位まで表示されます。
ans_d = num1 + num2; //ans_d = (num1+num2)/2; としないことに注意
ans_d = ans_d/2;
の部分ですが、上の行ではint型の変数 num1 + num2 をdouble型の変数 ans_d に変換しています。上の例で言えば、num1 + num2 は 24 +11 なので 35 になります。それをdouble型に変換するので 35.000000 となります。
そして2行目で35.000000を2で割っているためans_dには17.500000が格納されているということになります。
“//ans_d = (num1+num2)/2; としないことに注意”とありますがなぜこれがダメなのでしょうか?
これは、35/2を計算した結果(=17[int型であるから小数点切り捨て])をdouble型に変換することになってしまい、ans_dに格納された数字は 17.000000 になってしまうということが問題です。
printf(" キャスト:%.1f\n", (double)(num1 + num2) / 2); //(num1+num2)をdouble型にキャスト
キャストとは、上で行った、ans_d = num1 + num2; の操作と似たようなもので、あらかじめ宣言していた型から別の型に変換するときに使います。
(double)(num1 + num2) の部分がキャストを行っている部分で、
(型名) 変数名
で宣言します。
また変数指定フォーマットを%.1fとしていますが”.1″とつけることで小数点第1位まで表示してくださいという指示を送ることができます。
このプログラムではint型のnum1とnum2をdouble型に変えるということを行っていますが、最初から
double num1,num2;
と宣言しておくという手法もあります。
そのとき、scanfの変数指定フォーマットは%lf(エルエフ)としなければならないことに注意しましょう。
scanf("%lf", &num1);
char型
続いては文字型のcharについてみていきましょう。
charは文字を格納する変数を扱うための型です。以下のプログラムで確認していきましょう。
/***
filename:char.c
***/
#include<stdio.h>
int main(void)
{
char s1[] = "A";
char s2[] = "ABC";
printf("s1の文字列は %s\n",s1);
printf("s2の文字列は %s\n",s2);
printf("s2の文字列の1文字目は %c\n",s2[0]);
printf("s2の文字列の2文字目は %c\n",s2[1]);
printf("s2の文字列の3文字目は %c\n",s2[2]);
printf("s2の文字列の4文字目は %c\n",s2[3]);
return 0;
}
このソースコードを理解するためにはまず、配列について学ばなければいけません。一緒に確認していきましょう。
配列
配列は
型名 変数[要素数]
で宣言します。
変数とは文字や数字を格納するための箱のようなものです。配列はその箱を要素数ぶんだけ並べたものだと思ってください。図に示すとこんな感じ。

配列の要素数は指定しなければ、宣言された時の文字列と文字列の終わりを表す”\0″の分だけ用意されます。ですから上の変数sの配列の要素数は”ABC”と”\0″を合わせて4つということになります。
要素数は0番目から始まるので格納された文字のn番目を呼び出したいときには、
変数[n-1]
と宣言しなければいけません。
ソースコードの説明
printfで文字列を出力するときの変数指定フォーマットは%sです。
逆に一文字だけ出力するときには%cを使います。

次回はif文やfor文など条件分岐について扱っていきます。条件分岐では配列が活躍するので、復習しておきましょう。
C言語学習におすすめのテキストはこちら