int64_t转换为'long double'问题

时间:2012-08-19 22:00:29

标签: c++

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

2 个答案:

答案 0 :(得分:4)

忽略我不理解的boost::static_cast,64位有符号整数不能代表您显示的数字,但是

18446743496931269238 - 2 64 = -576778282378

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

那是什么boost::static_cast

答案 1 :(得分:1)

int64_t fops_count1 = 18446743496931269238;

这是签名溢出,即UB。 int64_t的最大值大约为2 ^ 63,这肯定小于此值。好像你的处理器实现了回绕,给出了你看到的负值。