型と型変換
型
- int — 整数
- double — 浮動小数点数
平均点を求めるプログラム
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 int sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%d点です。", sum / 5); return 0; }
正しい結果は70.4
しかしプログラムは平均点は70点と表示され、一部情報を失ってしまう。
sum / 5 = 70 (余り 2)
型と演算
算術変換
オペランドは、式の中でよりサイズの大きい型に合わせて変換されるというお約束があります。(暗黙的な型変換)
もし、サイズの大きい型を小さい型に変換した場合、上位ビットを切り捨てることになるため、情報を失ってしまう可能性があります。しかし、サイズを拡張する場合は情報を失うことはありません。
sum / 5 = 70
sum / 5.0 = 70.4
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 int sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%f点です。", sum / 5.0); return 0; }
代入変換
代入の場合も、型が異なる場合は暗黙的に変換して代入されます。これを代入変換と呼びます。
- 拡張変換
- 縮小変換 (情報一部損失)
- 整数から整数の場合、上位ビットが切り捨て
- 浮動小数点数から整数の場合、小数部の情報が失われ
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 double sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%f点です。", sum / 5); return 0; }
型キャスト変換
指定した型に値を変換するようにプログラマが伝える明示的な変換方法も存在します。これを型キャスト変換と呼びます。
(変換型名)式
sum / 5 = 70
(double) sum / 5 = 70.4
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int score[5]; // 5人の点数を入れる配列 int sum; // 合計点 // 各点数を入れる score[0] = 77; score[1] = 80; score[2] = 65; score[3] = 60; score[4] = 70; // 各点数を全て足して合計点を求める sum = score[0] + score[1] + score[2] + score[3] + score[4]; // 平均点を表示する printf("平均点は%f点です。", (double)sum / 5); return 0; }
演習課題
型キャストを利用して浮動小数点型変数 から実数や小数を取り出す
出力例:
浮動小数点数 = 12.34 実数 = 12 小数 = 0.34
解答例:
#include <stdio.h> int main() { float fVar = 12.34f; printf("全体 = %g\n" , fVar); printf("実数 = %d\n" , (int)fVar); printf("小数 = %g\n" , fVar - (int)fVar); return 0; }