1

以下代码产生显示的输出,我很困惑......我使用的是英特尔编译器版本 2013 beta update 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

即这是当一个二进制补码 64 位有符号整数环绕时得到的值。

现在那是什么boost::static_cast

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

这是有符号溢出,也就是UB。an 的最大值int64_t在 2^63 的数量级上,肯定小于这个值。似乎您的处理器实现了环绕,给出了您看到的负值。

于 2012-08-19T22:11:39.620 回答