1

次のコードは、表示されている出力を生成し、混乱しています... Intelコンパイラバージョン2013ベータアップデート2を使用しています/opt/intel/composer_xe_2013.0.030/bin/intel64/icpc:

// all good
int64_t fops_count1 = 719508467815;
long double fops_count2 = boost::static_cast<long double>(fops_count1);
printf("%" PRIu64 "\n", fops_count1); // OK outputs 719508467815
printf("%Le\n", fops_count2);         // OK outputs 7.195085e+11

// bad! why this?
int64_t fops_count1 = 18446743496931269238;
long double fops_count2 = boost::static_cast<long double>(fops_count1);
printf("%" PRIu64 "\n", fops_count1); // OK outputs 18446743496931269238
printf("%Le\n", fops_count2);         // FAIL outputs -5.767783e+11 <<<<<<<<<<<<<<<<< WHY?
4

2 に答える 2

4

boost::static_cast私が理解していない を無視すると、64 ビットの符号付き整数は、あなたが示した数値を表すことはできませんが、

18446743496931269238 - 2 64 = -576778282378

つまり、これは 2 の補数の 64 ビット符号付き整数がラップアラウンドしたときに得られる値です。

今それは何boost::static_castですか?

于 2012-08-19T22:07:38.147 に答える
1
int64_t fops_count1 = 18446743496931269238;

これは UB である符号付きオーバーフローです。an の最大値はint64_t2^63 のオーダーであり、これはこの値よりも確実に小さくなっています。プロセッサがラップアラウンドを実装しているようで、負の値が表示されます。

于 2012-08-19T22:11:39.620 に答える