21章 型変換

http://www.geocities.jp/ky_webid/c/021.html


代入による暗黙の型変換の話

代入の場合、基本的には左辺の型にあわせられるので左辺の方が小さい型だった場合は警告が出る。


型キャストの話

明示的に型を指定して代入等を行うことができる構文のこと。

だいたいわかったところで問題へゴーっ!


問題1

次のプログラムを実行すると、何と表示されるでしょう?

int main(void) {
    float f;
    
    f = 100 / 3;
    printf( "%f\n", f );

    return 0;
}

これは、んーっと。

「33.33333・・・」かな?3がいくつ表示されるのかがちょっと想像付かない。


答え合わせ
$ main
33.000000

ぬおおおおおおお。

100と3がint型なのでそれを割ったところで33にしかならず、この時点で33なのでfに代入しても33のままということか。

でもじゃあfloatで計算するにはどうするの?

前の章で.0をつけて対応したので同じようにやってみる。

int main(void) {
    float f;
    
    f = 100.0 / 3.0;
    printf( "%f\n", f );

    return 0;
}
$ main
33.333332

おお、いけました。なるほどね。

で、一応今回覚えた明示的な型キャストでもいけるのか試してみた。

int main(void) {
    float f;
    
    f = (float)100 / (float)3;
    printf( "%f\n", f );

    return 0;
}
$ main
33.333332

このやり方でもちゃんとうまくいきました。


問題2

普通、short型の変数をprintf関数で表示するには、フォーマット指定子を%hdとします。ところが次のプログラムを実行すると、正しく表示できます。これはなぜでしょう?

何故か。

予想ですが、shortよりもintの方が大きいので表現できる範囲を内包しているため表示できるということじゃないでしょうか。


答え合わせ

問題1と同様、整数は最低でもint型として扱われます。よって、変数numがprintf関数に引数として渡される段階で、自動的にint型に変換されています。「-1」という数は、%dフォーマット指定子で正しく扱える数なので、問題なく「-1」が表示されます。

んーなんだか納得いかない感じですね。

自動的に変換というか、printfの引数の受け取りがint型になっているということなんじゃないでしょうか。

もしここで言うように整数は最低でもint型として扱われるとするのなら

short num = -1;

の時点でnumはshortではなく、intになるはずなので65535以上の値を表示できるはずですよね。

でも試してみたらできませんでした。

というわけで僕の結論としては

int main(){
    short num1 = -1;
    int num2 = num1;

    printf( "%d\n", num2 ); 
    return 0;
}

こういうことなんじゃないかなぁと思ったんですがどうなんでしょうか。

深く考えすぎかもしれないですが・・・。


問題3

次のプログラムは、正しい結果になりません。正しく「0.6」が表示されるように修正して下さい。

int main(void){
    float f = 30 / 100 * 2;
    printf( "%f\n", f );
    return 0;
}

これは問題1と同じですね。

int main(void){
    float f = 30.0 / 100.0 * 2;
    printf( "%f\n", f );
    return 0;
}

これで0.6が表示されました。