CSAPPで説明されているように、式(int)+ 1e10が-2147483648を生成しないのはなぜですか?[複製]

Dec 12 2020

CS:APP(x86-64アセンブリ/低レベルの教科書)を読んでいて、次のように述べています。

からfloatまたはdoubleまでint、値はゼロに向かって丸められます。例えば、1.999に変換され1ている間、−1.999に変換される−1.また、値がオーバーフローしてもよいです。C規格では、この場合の固定結果は指定されていません。Intel互換のマイクロプロセッサは、ビットパターン[10 ... 00](TMinwワードサイズの場合w)を整数の不定値として指定します。妥当な整数近似を割り当てることができない浮動小数点から整数への変換は、この値を生成します。したがって、式(int) +1e10-2147483648を生成し、正の値から負の値を生成します。

ここで言及されているIntel互換マイクロプロセッサとは何ですか?x86AMDシリーズを含むアーキテクチャ?

とにかく、私はWin1064ビットマシンを搭載したInteli5を持っていて、VisualStudioで試しました。

    #include <iostream>
    using namespace std;
    
    int main() {
        int b = (int)+1e10;
        cout << b << endl;
    }

そして1410065408出力として取得します。

また、私が試したint32_tとなっ1410065408すぎ。

なぜ私は結果がありません-2147483648である[10 ... 00]本が説明するように?

回答

2 chux-ReinstateMonica Dec 12 2020 at 09:49

使用するプロセッサに「浮動小数点から整数への変換で、妥当な整数近似を割り当てることができない場合は、この値が得られます。」がありますが、コンパイラは他のコードを使用して目標を達成できるため、これに従う必要はありません。

特に、のようにコンパイラ時に決定できるsome_32_bit_int = (int)+1e10;値は、のような値を取得するsome_32_bit_int = 10000000000 & 0xFFFFFFFF;1410065408、プロセッサから完全に独立している可能性があります。

整数部分の値を整数型で表すことができない場合、動作は定義されていません。 C17dr § 6.3.1.4 1

この本では、コンパイラではなくプロセッサについて説明しています。