型の大きさ、扱える情報

前項では、int型について説明しました。
int型は整数型と呼ばれ整数しか入れることができません。
小数点以下は切り捨てられてしまいます。
しかも入れることのできる数値は範囲があります。
次のプログラムを実行してみましょう。
int a = 0.5; //aを0.5で初期化

printf("%.2f\n",a); 
0.5 は表示されずに 0.00 が表示されてしまいます。
実際 a に入っている数値も 0 です。
int a = 2147483647; //int型の限界値で初期化

printf("%d\n",a);

a = a + 1; //オーバーフローさせる

printf("%d\n",a);
64ビットパソコンの場合、上の行の 2147483647 は正しく表示され、下の行は -2147483648 となってしまいます。
実はこれがint型の限界です。int型では 2147483647 を超えるような計算をするとマイナスに戻ってしまいます。
この現象を「桁あふれ」や「オーバーフロー」と呼びます。

double型

double型とは、浮動小数点型とばれています。
int型は整数しか入れることができませんでしたが、bouble型は小数点を持つような数、
つまり実数を入れることができます。
またint型よりも、入れることのできる数値の範囲も大きいため 2147483647 を超えるような計算もできます。
しかし、その分パソコンのメモリを多く消費します。
乱用するとパソコンの動作を遅くしてしまうことになるので、必要のないときはint型を使いましょう。
次のプログラムを実行し、確認してください。
double a = 0.5; //aを0.5で初期化
printf("%.2f\n",a);
ちゃんと 0.50 と表示されました。 a の中にもちゃんと 0.5 が入っています。
double a = 2147483647;

printf("%.0f\n",a);

a = a + 1;

printf("%.0f\n",a);
ちゃんと 2147483648 が表示されました。
しかし、double型にも入れることのできる数値に範囲があります。
上限が 1.792693e+308 で、下限が 2.225074e-308 となっています。
この 「e+308」 は 1e+3 で 1掛ける10の3乗、1000になります。
「e-308」 は 1e-3 で 1割る10のマイナス3乗、0.001になります。
つまり普通の数字に直すと 1.792693e+308 は 179269300000000000… とても書ききれそうにありません。
2.225074e-308 は 0.0000000000…2225074 こちらも書ききれそうにありませんね。
プログラムに打って確かめるのはやめておきましょう。

char型

char型はint型やdouble型とは少し違う型になります。
int型やdouble型は数値を入れていましたが、char型は文字を入れる変数になります。
入れられる文字は半角で1文字になります。 ※一部の特殊文字や全角文字は入れられません。
char a = 'A'; //aに'A'を代入

printf("%c\n",a);
画面に A が表示されました。
char型はもう少し先に進んでからもう一度説明します。
型変換(キャスト)
int型をdouble型ににしたり、double型をint型にすることがあります。
これを型変換、キャストなどと呼びます。
型変換のときは ( ) の中に変換後の型を書いてその後ろに変換したい変数を書きます。
※変換された数値が返ってくるだけで変数の型は変わっていない
次のプログラムを実行してみてください。
int a = 3;

int b = 10;
	
double c = 0;
	
c = b/a; //b÷aを計算してcに代入

printf("%f\n",c); //3.000000と表示されてしまう(正しい答えではない)
	
printf("%f\n",b/a); //0.000000と表示される
10÷3を計算して double型(少数も入れられる)に代入しましたが、答えは 3.000000 になっています。
結果を確認したら少し書き換えて次のようにしてください。
int a = 3;

int b = 10;
	
double c = 0;
	
c = (double)b / (double)a; //キャストされた状態でb÷aを計算してcに代入

printf("%f\n",c); //3.333333と表示される(正しい答えに近い)

printf("%f\n",b/a); //変数a と 変数b の型は変わっていないため0.000000と表示される
答えは 3.333333 となっています。
無限小数を表示するということはできないため、途中までの表示ですが正しい答えになっています。
しかし、printf("%f\n",b/a); の部分は正しく表示れていません。
キャスト(型変換)はその瞬間だけ別の型として扱うだけで、変数自体の型を変えることはないからです。
double型の変数をint型に変換すると小数点以下は切り捨てられてしまいます。

練習問題

第1問
 125÷37の余りを求めてそれに47をかけて8を足した数を表示する。
第2問
 int型の変数 a と b を宣言して a には適当な数値を代入し、 b には a+5 の数値を代入し、それぞれ表示する。
第3問
 double型の変数を宣言して 0.9 以下で 0 よりも大きい数値を代入して表示。