型のキャストって使ってますか?ある型の変数を別の型に変換したいときに使います。
C言語では型の変換は記述なしで暗黙的に行ってくれる場合もありますが、明示的に記述して行う場合もあります。記述して明示的に型の変換を行うことをキャストといいます。
この記事では、型のキャストについて
- 型変換とは
- 暗黙的型変換について
- 明示的型変換について
- ポインタ型へのキャストについて
- キャストの注意点について
など基本的な内容から、詳しい内容についても解説していきます。今回は型のキャストについて、使い方をわかりやすく解説します!
型変換とは
型変換とは、変数やオブジェクトを宣言時に定義にした型とは別の型に変えることを言います。型の変換には明確に記述しなくても行われる暗黙的型変換と記述して行う明示的型変換とがあります。
明示的型変換のことを特にキャストと言います。
暗黙的型変換について
暗黙的型変換は明確に記述しなくても、代入や式中で行われます。代入の際に「=」記号の左辺の型と右辺の型が違う場合、左辺の型に変換されます。
また、式中での変換は、式中で違う型の変数や定数が記述されている場合、基本的には型の精度の高い方に変換されます。優先される順序は下記のとおりです。
それではサンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int num = 3; double dbl; /* 暗黙的型変換 * double型変数にint型変数を代入 */ dbl = num; printf("double型変数dblの値は: %lf\n", dbl); /* 暗黙的型変換 * int型の変数が式中でdouble型に変換 */ double result; result = dbl + num; printf("double型変数resultの値は: %lf\n", result); return 0; }
実行結果:
double型変数dblの値は: 3.000000 double型変数resultの値は: 6.000000
このサンプルコードでは、まずdouble型の変数「dbl」にint型の変数「num」を代入し、暗黙的型変換を行っています。int型の変数「num」はdouble型に変換されています。
また、double型の変数「result」を算出するための式中で、double型の変数「dbl」とint型の変数「num」を足し合わせる際に暗黙的変換を行っています。
int型の変数「num」はdouble型に変換されています。
明示的型変換(キャスト)について
記述して型の変換を行うことをキャストといいます。キャストは以下のように記述します。
(型名)式
int型とdouble型の型変換
たとえばint型の変数を分母として割り算を行う場合は、浮動小数点数型への暗黙的型変換は行われず意図しない値が算出されるのでキャストを行う必要があります。
サンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int num = 3; double result; // キャストを行う場合 result = 1 / (double)num; printf("double型変数resultの値は: %lf\n", result); // キャストを行わない場合 result = 1 / num; printf("double型変数resultの値は: %lf\n", result); return 0; }
このサンプルコードではint型の変数「num」を分母で割り算を行っています。int型の変数をdouble型にキャストした場合は意図どおりの結果となり、キャストしない場合は意図と違う結果となっています。
int型とchar型の型変換
char型の変数は文字を格納することができますが、-128から127までの値も格納します。
また、unsigned char型の変数は0から255までの値を格納します。char型の文字をint型に変換すると、それぞれの文字に割り当てられた文字コードと呼ばれる0以上の数値として扱うことができます。
ちなみに、文字コードはSJISやUTF-8などコードを記述するファイルの形式によって異なります。また、int型をchar型に変換すると文字として扱うことができます。
ただしchar型に変換する場合は、文字に割り当てられた文字コードが0以上の値ですので、値の範囲が0から255までの数値をunsigned char型に変換するようにしましょう。
範囲外の数値をunsigned char型にキャストすると意図しない値となるので、ご注意ください。
それではサンプルコードで確認しましょう。
#include <stdio.h> int main(void) { char chr = 'a'; int num; unsigned char uchr; // 文字から数値への変換 num = (int)chr; printf("int型変数numの値は%d\n", num); // 数値から文字への変換 uchr = (char)num; printf("unsigned char型変数uchrの値は%c\n", uchr); return 0; }
実行結果:
int型変数numの値は97 unsigned char型変数uchrの値はa
このサンプルコードでは、まずchar型の変数chrをint型にキャストしています。
次にint型の変数numをchar型にキャストしています。なお、このサンプルコードはUTF-8形式でコードを記述しています。
UTF-8の場合は、数値の0から127まで文字が割り当てられていますので、int型の数値をchar型に変換する場合は数値の範囲に注意しましょう。
ちなみにSJISなどの場合のように、文字コードによっては255まで文字が割り当てられていることもあります。
※[補足]char型の整数は、多くの環境で「-128〜127」を扱えるとして知られています。ただし環境によっては、unsignedをつけなくとも、符号なし整数変数(0〜255)として扱われる場合もありますので注意しましょう。
ポインタ型へのキャストについて
ポインタ型へキャストすることもできます。ポインタ型へのキャストは以下のように記述します。
(型名*)式
それではサンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { char str[8] = "Hello"; char *ptr; // char型ポインタへのキャスト ptr = (char*)str; printf("char型ポインタのアドレス先の値は: %s\n", ptr); return 0; }
実行結果:
char型ポインタのアドレス先の値は: Hello
このサンプルコードではchar型の配列「str」をchar型のポインタ「ptr」にキャストして「ptr」のアドレス先の値を表示しています。
キャストの注意点について
キャストを行う際に気を付けなければならない注意点がいくつかあります。確認していきましょう。
小数点以下の切り捨てについて
double型などの浮動小数点数型からint型などの整数へキャストする場合は小数点以下が切り捨てられますので、注意が必要です。サンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int num; double dbl = 3.14; // double型変数からint型変数へのキャスト num = (int)dbl; printf("int型変数numの値は: %d\n", num); return 0; }
実行結果:
int型変数numの値は: 3
このサンプルコードではdoouble型の変数「dbl」をint型変数「num」にキャストしています。int型変数「num」の値は「3」と小数点以下が切り捨てられています。
符号ありと符号なしの変換について
マイナスの値の変数を符号なし型の変数にキャストしてもマイナスを取った値にはなりません。意図しない値となるので注意しましょう。
サンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { char chr = -100; unsigned char uchr; // 符号付きchar型変数から符号なしchar型変数へのキャスト uchr = (unsigned char)chr; printf("unsigned char型変数uchrの値は: %u\n", uchr); return 0; }
実行結果:
unsigned char型変数uchrの値は: 156
このサンプルコードでは符号付きchar型の変数「chr」を符号なしchar型「uchr」にキャストしています。
「uchr」の値は「chr」の値のマイナスを取った値ではなく、意図しない値となっています。
オーバーフロー(桁あふれ)について
型の範囲外の値を代入して意図しない値になることをオーバーフロー(桁あふれ)といいます。範囲の大きい型から小さい型へキャストする場合はこのオーバーフローが起こる可能性があるので、注意が必要です。
サンプルコードで確認していきましょう。
#include <stdio.h> int main(void) { int num = 1000; char chr; // int型変数からchar型変数へのキャスト chr = (char)num; printf("char型変数chrの値は: %d\n", chr); return 0; }
実行結果:
char型変数chrの値は: -24
このサンプルコードではint型の変数「num」をchar型の変数「chr」にキャストしています。
「num」の値は「1000」とchar型の値の範囲-128~127外の値からキャストしていますので、「chr」の値は意図しない値になっています。
まとめ
ここでは、型のキャストについて説明しました。
キャストする際には、小数点以下切り捨て、符号付きから符号なしへの変換、オーバーフローなどで意図しない値にならないように注意しましょう。
使いこなすことができるように、この記事を何度も参考にして下さいね!