C 言語の型キャスト: 暗黙的・明示的変換をコード例でマスター
C 言語における型キャストとは?
C では、型キャスト (データ変換) はあるデータ型の値を別のデータ型に変換するプロセスです。すべての C プログラマーがマスターすべき基本概念です。
暗黙的型キャスト
暗黙的 (自動) 型キャストは、開発者の介入なしにコンパイラが自動的にあるデータ型を別のデータ型に変換することです。これは値の意味が保持され、ターゲット型がソース値を表現できる場合にのみ発生します。
- 暗黙的変換は代入、関数呼び出し、算術演算時に自動実行されます。
- 2 つのオペランドの型が異なる場合、ランクの低いオペランドがより高いランクの型に昇格されます。
例:
#include<stdio.h>
int main() {
short a = 10; // short
int b; // int
b = a; // 暗黙的キャスト
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
出力:
10 10
コンパイラは short 値を int に自動昇格させ、情報損失を防ぎます。
文字から整数への昇格
char が算術式に参加すると、コンパイラはその ASCII コードを用いて int に昇格させます:
#include <stdio.h>
int main() {
int number = 1;
char character = 'k'; /* ASCII 107 */
int sum = number + character;
printf("Value of sum : %d\n", sum);
return 0;
}
出力:
Value of sum : 108
算術変換の階層
C 標準は、文字昇格後にオペランドが異なる場合、以下のチャートの上位にある型に変換される階層を定義しています:
例:
#include <stdio.h>
int main() {
int num = 13;
char c = 'k'; /* 107 */
float sum = num + c;
printf("sum = %f\n", sum);
return 0;
}
出力:
sum = 120.000000
ここでは c がまず int に昇格し、その後両オペランドが float になってから加算されます。
暗黙的変換の重要ポイント
- 標準変換とも呼ばれ、キャスト演算子は不要。
- より小さい型から大きい型への昇格は 型昇格 と呼ばれる。
- 互換性のある型のみ暗黙的に変換可能。それ以外はコンパイラが警告/エラーを出す。
- 情報損失を伴う非互換変換 (例:
doubleからfloat) は避けるか明示的にキャストすべき。
明示的型キャスト
明示的キャストは、コンパイラが自動実行しない変換を強制します。小数部を切り捨てたり、無関係な型間で変換したりする際に必須です。
構文はシンプル:
(type-name) expression
通常なら切り捨てられる除算で精度を保つ明示的キャスト例:
#include <stdio.h>
int main() {
int var1 = 10, var2 = 3;
int result = var1 / var2; // 3、小数部失われる
int result2 = (int)((float)var1 / var2); // 3.333… を int にキャスト → 3
printf("result = %d\n", result);
printf("result2 = %d\n", result2);
return 0;
}
無関係な型間の変換にも明示的キャストが有用:
#include <stdio.h>
int main() {
float a = 1.2;
int b = (int)a + 1; // float を int にキャスト
printf("Value of a is %f\n", a);
printf("Value of b is %d\n", b);
return 0;
}
出力:
Value of a is 1.200000 Value of b is 2
まとめ
- 型キャストは値をある型から別の型に変換する。
- 暗黙的変換は自動的で、型互換時は安全。
- 明示的変換はキャスト演算子で強制する。
- データ損失の可能性がある変換は常に見直す。
ベストプラクティス ガイドライン
- 可能なら除算前に
intをfloatに変換して精度を維持。 - メモリ制約がない限り
floatをdoubleに優先しない。 - 整数演算には
int、テキストデータにはcharを使用。
C言語
- 「信頼性のインターネット」におけるデータ活用:効果的管理のための戦略
- C#型変換完全ガイド:暗黙・明示的変換、Parse、Convertクラス
- C++型変換完全ガイド:暗黙・明示変換とキャスト技法
- C++ switch文をマスター:構文、使い方、実践例
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C++構造体を実例で徹底解説
- C++のstd::listをマスターする:構文、関数、実践例
- C#データ型完全ガイド:値型、参照型、ポインタ型
- C#の型変換:暗黙的・明示的キャストを徹底解説
- Python 型変換とキャスト: 包括的ガイド
- Java型キャスト完全ガイド:拡大変換から縮小変換まで