2017/10/14

[c/c++]16bit→32bitへの拡張は行われるが、32bit→64bitへの拡張は自動で行われない

ミスった・・・。

Windows 10 64bit(Bash on Ubuntu on Windows)
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5)

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    int32_t  a = -1;
    uint32_t b =  1;
    if (a < b) {
        printf("OK\n");
    } else {
        printf("NG\n");
    }
}


私は、符号違いのために64bitまで自動で拡張されてOKルートを通ると考えていたのだ。
たぶん、過去にも同じような記事を書いていたと思うが、そうではなくNGルートを通った。
変数が32bitではなく、16bitであればOKルートを通る。


『Cクイックリファレンス』のp.48に、同じような例が書かれていた。
まず、-1の方がuint32_tに変換されるのだ。
もちろん、明示的にint64_tに変換すればOKルートを通るのだ。


符号の有無が異なるところは、明示的にキャストした方が無難だな。
昔はコンパイラでwarningが出ていたような気がするけど、-Wallしても出ないんだよなぁ。
-Wだけの方がよいかもしれん。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。