0Pricing
C Academy · レッスン

変換の落とし穴

オーバーフローと切り捨てです。

「変換の落とし穴」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

変換には落とし穴がある

暗黙の変換は便利ですが、オーバーフローや切り捨て、符号に関する予期せぬ問題を引き起こすことがあります。このレッスンでは、その落とし穴を扱います。

#include <stdio.h>
int main(void) {
    printf("Beware silent conversions\n");
    return 0;
}

整数オーバーフロー

対象の整数型で表現できないほど大きな値を代入すると、値がラップアラウンドするか、データが失われます。

#include <stdio.h>
#include <limits.h>
int main(void) {
    int max = INT_MAX;
    printf("INT_MAX = %d\n", max);
    return 0;
}

縮小変換による切り捨て

大きな値を小さい型に格納すると下位ビットだけが残り、数値が何の通知もなく壊れます。

#include <stdio.h>
int main(void) {
    int big = 300;
    unsigned char small = (unsigned char)big;
    printf("small = %d\n", small);
    return 0;
}

符号付きと符号なしの混在

符号付きと符号なしを混在させると、符号付きの値が符号なしに変換され、負の値が非常に大きな正の値になります。

#include <stdio.h>
int main(void) {
    int a = -1;
    unsigned int b = 1;
    if (a > b)
        printf("surprise: -1 > 1 as unsigned\n");
    return 0;
}

ループカウンターの落とし穴

unsignedのループカウンターが0未満になると、大きな値にラップアラウンドして無限ループを引き起こします。カウントダウンには符号付きのカウンターを使用してください。

#include <stdio.h>
int main(void) {
    for (int i = 3; i >= 0; i--)
        printf("%d ", i);
    printf("\n");
    return 0;
}

floatからintへの変換による損失

floatをintに変換すると小数部分が失われます。値がintの範囲を超える場合、結果は未定義です。

#include <stdio.h>
int main(void) {
    double d = 3.99;
    int n = (int)d;
    printf("n = %d\n", n);
    return 0;
}

doubleからfloatへの精度損失

高精度のdoubleをfloatに格納すると桁が失われ、長い計算ではその影響が蓄積する可能性があります。

#include <stdio.h>
int main(void) {
    double d = 1.123456789012345;
    float f = (float)d;
    printf("%.7f\n", f);
    return 0;
}

charの符号に関する注意

charが符号付きかどうかは処理系定義です。負の結果を避けるため、バイト値にはunsigned charを使用してください。

#include <stdio.h>
int main(void) {
    unsigned char b = 200;
    printf("b = %d\n", b);
    return 0;
}

除算してから変換

整数除算を行ってからキャストしても、失われた小数部分は戻せません。除算の前にキャストしてください。

#include <stdio.h>
int main(void) {
    int a = 7, b = 2;
    double wrong = (double)(a / b);
    double right = (double)a / b;
    printf("%.1f vs %.1f\n", wrong, right);
    return 0;
}

サイズの比較

値が収まると決めつける前に、limits.hの定数を使って型が保持できる範囲を確認してください。

#include <stdio.h>
#include <limits.h>
int main(void) {
    printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX);
    return 0;
}

安全な型変換

縮小変換の前に範囲を確認し、迷った場合はより広い型を優先してください。また、意図が明確になるようキャストを明示します。

#include <stdio.h>
int main(void) {
    long value = 200;
    if (value >= 0 && value <= 255)
        printf("fits in a byte: %ld\n", value);
    return 0;
}

クイックチェック

型変換の落とし穴についての理解度を確認しましょう。

まとめ:型変換の落とし穴

暗黙の型変換に潜む危険性を学びました。

  • 縮小変換ではオーバーフローや切り捨てが起こる可能性があります
  • 符号付きと符号なしの混在により比較結果が逆転することがあります
  • 符号なしのカウンターは0未満になるとラップアラウンドします
  • 小数部分を保つには、除算の前にキャストします
  • 範囲を確認し、キャストを明示します

よくある質問

「変換の落とし穴」レッスンは無料ですか?

はい。「変換の落とし穴」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「変換の落とし穴」で何を学びますか?

オーバーフローと切り捨てです。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「変換の落とし穴」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 暗黙の変換
  2. 明示的なキャスト
  3. 整数と浮動小数点数の変換
  4. 変換の落とし穴
← C Academyに戻る