変数のデータ型を変更することを型変換と言い、型変換を明示的に行うことをキャストと言います。
型変換はある変数に異なるデータ型の値を代入する際などに用いられます。
キャストとは?意味を解説
キャストとは変数のデータ型を明示的に変更することを言います。
以下で1割る2の結果を変数ansに代入して出力するコードを用いて解説します。
例1:
#include <stdio.h> void main() { float ans; ans=1/2; //整数の計算結果をansに代入 printf("ans=%f\n",ans); ans=(float)1/2; //計算結果を浮動小数点型にキャスト printf("ans=%f\n",ans); }
実行結果
ans=0.000000
ans=0.500000
1回目の計算では整数どうしの計算結果をansに代入しています。
整数どうしの計算結果は整数となり、小数点以下は切り捨てられるのでansには0が代入されます。
これは解として正しくないですよね。
そこで2回目の計算では小数点以下を切り捨てないために1割る2の計算結果をfloat型に変換しています。
この変換作業をキャストと言います。
型変換(キャスト)の書き方
明示的型変換(キャスト)
例1のようにコードを書いてキャストすることを明示的型変換と言います。
キャストの書き方
(キャスト後のデータ型)キャストする変数や数字
カッコ内に書いたデータ型に変換されます。
例2:
#include <stdio.h> void main() { int i=1; printf("i=%f\n",(float)i); //iを浮動小数点型に変換 }
実行結果
i=1.000000
暗黙的型変換
これに対してキャストのコードを書かずに型変換する暗黙的型変換もあります。
代入時の暗黙的型変換
変数に異なる型の値を代入する場合は左辺の変数の型に合わせるよう、暗黙的に型変換されます。
以下の例では浮動小数点型変数fに整数型変数iを代入することで暗黙的型変換がされています。
例3:
#include <stdio.h> void main() { int i=1; float f=i; //整数型から浮動小数点型への暗黙的型変換 printf("f=%f\n",f); }
実行結果
f=1.000000
式における暗黙的型変換
式中に複数のデータ型が入り混じるときは最も精度の高いデータ型に統一されます。
例4:
#include <stdio.h> void main() { printf("%f\n",1+1.3); //浮動小数点型で出力 printf("%d\n",1+1.3); //整数型で出力(NGコード) }
実行結果
2.300000
1717986918
整数型の1と浮動小数点型の1.3の和はより精度の高い浮動小数点型として処理されます。
そのため正しい値を出力するにはデータ指定子に浮動小数点型を使う必要があります。
ポインタ型への型変換(キャスト)の書き方
明示的型変換(キャスト)
変数のアドレスはポインタへ型変換できます。
ポインタ型へのキャストの書き方
*ポインタ名=(キャスト後のデータ型*)&キャストする変数
例5:
#include <stdio.h> void main() { int i=1; int *ptr=(int*)&i; printf("*ptr=%d\n",*ptr); }
実行結果
*ptr=1
暗黙的型変換
同様のことは暗黙的型変換でも可能です。
例6:
#include <stdio.h> void main() { int i=1; int *ptr=&i; printf("*ptr=%d\n",*ptr); }
実行結果
*ptr=1
上は例5のキャスト構文「(int*)」を省いただけのコードです。
ポインタ型への変換は通常、暗黙的型変換が使われます。
型変換(キャスト)利用時の注意点
型変換による小数点以下の切り捨て
浮動小数点型から整数型へ型変換する際には小数点以下が切り捨てられるので注意です。
以下の例では浮動小数点型変数fを整数型変数iに代入した後、iの値を再びfに代入した結果です。
例7:
#include <stdio.h> void main() { float f=1.5; printf("f=%f\n",f); int i=(int)f; f=(float)i; printf("f=%f\n",f); }
実行結果
f=1.500000
f=1.000000
実行結果を見るとiを経由した後のfは小数点以下が切り捨てられて0になってしまっています。
整数どうしの割り算による小数点以下の切り捨て
例4のように整数と実数の計算においては暗黙的型変換が行われ、解が浮動小数点型になります。
しかし整数どうしの計算結果が実数になる場合は暗黙的型変換が行われないので注意です。
例8:
#include <stdio.h> void main() { printf("%f\n",1/2); //①暗黙的型変換が行われない printf("%f\n",1/2.0); //②暗黙的型変換が行われる printf("%f\n",1/(float)2); //③明示的型変換 }
実行結果
0.000000
0.500000
0.500000
①では暗黙的型変換が行われないので意図した結果になっていません。
暗黙的型変換が行われるようにするには②のように1か2の一方または両方を2.0のように実数として書く必要があります。
③のように明示的型変換で一方または両方の数字を浮動小数点型にしても意図した結果が得られます。
小さい型への変換(オーバーフロー)
取れる値の範囲が大きい型から小さい型へ型変換すると意図しない値になることがあります。
これをオーバーフローといいます。
例えばchar型は-128~127の数字を表せるのに対してint型は-2147483648~2147483647を表せます。
printfにおいてchar型変数にフォーマット指定子%cを使うと文字が出力されますが、%dを使うと数字が出力されます。どちらにせよchar型変数には数字が保存されており、前者ではその値を文字に変換して出力します。後者では保存されている値を整数に変換して出力します。
以下の例のようにchar型の範囲外の数字を代入するとオーバーフローを起こします。
例8:
#include <stdio.h> void main() { int i=200; char c=(char)i; printf("c=%d\n",c); }
実行結果
c=-56
左辺の変数が取れる範囲外の値を渡していないかに確認しましょう。
C言語で行き詰まったら…
-
C言語・C++がわからない時に質問できるサイト・サービス5選
C言語を独学で勉強しているけど内容がイマイチわからない。もはや何がわからないのかもわからない。 C++のエラーが解決できない。ググってもわからない。わかる人に解説してほしい。 こんなお悩みにお答えしま ...
続きを見る