CSAPPで説明されているように、式(int)+ 1e10が-2147483648を生成しないのはなぜですか?[複製]
CS:APP(x86-64アセンブリ/低レベルの教科書)を読んでいて、次のように述べています。
から
float
またはdouble
までint
、値はゼロに向かって丸められます。例えば、1.999
に変換され1
ている間、−1.999
に変換される−1.
また、値がオーバーフローしてもよいです。C規格では、この場合の固定結果は指定されていません。Intel互換のマイクロプロセッサは、ビットパターン[10 ... 00](TMinw
ワードサイズの場合w
)を整数の不定値として指定します。妥当な整数近似を割り当てることができない浮動小数点から整数への変換は、この値を生成します。したがって、式(int) +1e10
は-2147483648
を生成し、正の値から負の値を生成します。
ここで言及されているIntel互換マイクロプロセッサとは何ですか?x86
AMDシリーズを含むアーキテクチャ?
とにかく、私はWin1064ビットマシンを搭載したInteli5を持っていて、VisualStudioで試しました。
#include <iostream>
using namespace std;
int main() {
int b = (int)+1e10;
cout << b << endl;
}
そして1410065408
出力として取得します。
また、私が試したint32_t
となっ1410065408
すぎ。
なぜ私は結果がありません-2147483648
である[10 ... 00]
本が説明するように?
回答
使用するプロセッサに「浮動小数点から整数への変換で、妥当な整数近似を割り当てることができない場合は、この値が得られます。」がありますが、コンパイラは他のコードを使用して目標を達成できるため、これに従う必要はありません。
特に、のようにコンパイラ時に決定できるsome_32_bit_int = (int)+1e10;
値は、のような値を取得するsome_32_bit_int = 10000000000 & 0xFFFFFFFF;
か1410065408
、プロセッサから完全に独立している可能性があります。
整数部分の値を整数型で表すことができない場合、動作は定義されていません。
C17dr § 6.3.1.4 1
この本では、コンパイラではなくプロセッサについて説明しています。