はじめに
MISRA-Cの学習を進めています。
符号なし整数定数式は、結果の型で表現できる範囲内で記述する。とあり、暗黙の型変換について調査し始めた。

C言語では、
符号付き(signed)と符号無し(unsigned)の整数型を比較する際に暗黙の型変換が行われます。この型変換は、C言語の算術型変換規則に基づいて実行され、通常は「より精度の高い型」に合わせて変換されます

暗黙の型変換の動作
符号無し型への変換:
- 比較演算で符号付き整数と符号無し整数が混在している場合、符号付き整数が符号無し整数に暗黙的に変換されます。
- 例えば、
int data1 = -1; unsigned int data2 = 15;
の場合、data1
はunsigned int
に変換されます。この結果、-1
は符号無しとして扱われ、ビットパターンが4294967295
(32ビット環境の場合)と解釈されます。
そのため、
条件式data1 < data2
は4294967295 < 15
と評価され、
成立しません
データ損失や意図しない結果のリスク:
符号付きから符号無しへの変換では、負数が非常に大きな正数として扱われるため、不正確な比較結果を生じる可能性があります
解決策
暗黙の型変換による問題を回避するためには以下の方法が推奨されます:
明示的なキャスト
比較する前に片方の値を明示的にキャストして型を揃えます
int main(void){
int si = -1;
unsigned int ui = 15;
if (si < (signed int)ui) {//真になる
//if (si < ui) { //真にならない
printf(“ui is larger\n”);
}else{
printf(“ui is small”);
}
さいごに
どうでしたか、意外と迷う内容ですが、わかればそうでもないですね。小さいことからコツコツと頑張りましょう。
コメント