型変換は変数をあるデータ型から他のデータ型に変換する手段の1つです。
例えば、long型のデータをint型の変数に格納したいとき、そのままでは変数とデータの型が異なるので、予期していない結果になってしまうかもしれません。
こんなとき、C言語では以下に示すようなキャスト演算子を明示的に記述することで、値を別のデータ型に変換することができます。
1 2 3 |
(type name) expression |
型変換のサンプルコード
型変換が有効に活用できる例を見てみましょう。
まずは以下の除算のコードを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> int main(void) { int a = 100; int b = 3; double result; result = a / b; printf("result: %f\n", result); return 0; } |
100÷3をしているので、数学的には33.3333….と出力されるのが正しい結果となります。
しかし実際には、以下のように33.000000と出力されることになります。
1 2 3 |
result: 33.000000 |
このようになってしまうのはaとbがint型なのが原因で、正しい結果を得るためには、変数aをint型からdouble型にキャストする必要があります。
キャスト演算子を使ってaを明示的に型変換したコードが以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> int main(void) { int a = 100; int b = 3; double result; result = (double) a / b; printf("result: %f\n", result); return 0; } |
結果は、
1 2 3 |
result: 33.333333 |
となり、正しい結果が得られていることが分かります。
型変換はキャスト演算子を使って明示的に行う以外にも、コンパイラによって自動的にキャストすることで暗黙的に行うこともできるのですが、
良いプログラミングの作法としては、型変換が必要なときには常にキャスト演算子を使うのが望ましいとされているようです。
汎整数拡張(Integer Promotion)
汎整数拡張とは、ある型の整数を扱うときに、ある条件のうえでその整数の型を格上げ、または格下げすることを言います。
格上げをすると、ある型からもっと多くの情報を表現できる型へ変換することになります。
逆に格下げをすると、より少ないビット数の型へと変換されることになります。
汎整数拡張の例としては、char型からint型への変換が分かりやすいです。
この場合は、char型は1バイトでint型は4バイトなので、格上げの汎整数拡張と言えます。
以下のコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <stdio.h> int main(void) { int a = 5; char c = 'a'; int sum; sum = a + c; printf("result sum number: %d\n", sum); printf("result sum number: %c\n", sum); return 0; } |
このコードをコンパイルして実行すると、
1 2 3 4 |
result sum number: 102 result sum number: f |
と表示されます。
int型とchar型を足し算していますが、これが正しく計算できているのはchar型の”a”をint型に格上げの汎整数拡張をしているからです。