C++ int64#t转换为';长双人床';问题

C++ int64#t转换为';长双人床';问题,c++,C++,下面的代码生成显示的输出,我很困惑。。。我使用的是英特尔编译器2013版beta update 2/opt/Intel/composer\u xe\u 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 "

下面的代码生成显示的输出,我很困惑。。。我使用的是英特尔编译器2013版beta update 2
/opt/Intel/composer\u xe\u 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?
//一切正常
int64\u t fops\u count1=719508467815;
长双fops_count2=boost::static_cast(fops_count1);
printf(“%”PRIu64“\n”,fops_count1);//正常输出719508467815
printf(“%Le\n”,fops_count2);//正常输出7.195085e+11
//糟糕!为什么会这样?
int64_t fops_count1=18446743496931269238;
长双fops_count2=boost::static_cast(fops_count1);
printf(“%”PRIu64“\n”,fops_count1);//正常输出18446743496931269238

printf(“%Le\n”,fops_count2);//输出失败-5.767783e+11忽略
boost::static_cast
,我不明白,64位有符号整数不能表示您显示的数字,但是

18446743496931269238-264=-576778282378

也就是说,这是当2的补码64位有符号整数换位时得到的值


现在那是什么?

忽略
boost::static\u cast
,我不明白,64位有符号整数不能代表您显示的数字,但是

int64_t fops_count1 = 18446743496931269238;
18446743496931269238-264=-576778282378

也就是说,这是当2的补码64位有符号整数换位时得到的值

现在那是什么
boost::static_cast

int64_t fops_count1 = 18446743496931269238;
这是有符号溢出,即UB。
int64\t
的最大值约为2^63,这肯定小于此值。看起来你的处理器实现了wrapparound,给出了你看到的负值



这是有符号溢出,即UB。
int64\t
的最大值约为2^63,这肯定小于此值。看起来你的处理器实现了wrapparound,给出了你看到的负值

也许这个值太大了,即使是一个长的双精度?这是什么
boost::static\u cast
?您不能使用关键字作为某事物的名称。@H2CO3:它应该适合
长双精度
很好;但不是在
int64\u t
中。我假设这是针对i386或x86\u 64平台,其中
长双精度
具有80位精度。(在许多平台上,大小各不相同。在一些平台上,
long double
的宽度不超过
double
。为了完整起见,我提到了这一点。)也许这个值对于长double来说太大了?这是什么
boost::static\u cast
?您不能使用关键字作为某事物的名称。@H2CO3:它应该适合
长双精度
很好;但不是在
int64\u t
中。我假设这是针对i386或x86\u 64平台,其中
长双精度
具有80位精度。(在许多平台上,大小各不相同。在一些平台上,
长双精度
不比
双精度
宽。我提到这一点是为了完整性。)@Giovanni:谢谢,但这涉及到
静态施法
,但这不可能是OP使用的。在标准C++中,OP的语法无效。代码>静态_cast
是一个关键字;它不能用作名称。@Giovanni:谢谢,但这涉及到
静态\u cast
,它不能是OP使用的名称。在标准C++中,OP的语法无效。代码>静态_cast
是一个关键字;它不能用作名称。从技术上讲,
结果是实现定义的,或者引发了实现定义的信号
,而不是未定义的。真的吗?我认为有符号溢出完全是UB。@DeadMG:如果表达式的结果不能由表达式的类型(5/4)表示,则为UB;但是,如果结果不能表示,整数转换会给出一个实现定义的值(4.7/3)。@Dave:你引用的是C标准;在C++中,它只是“值是实现定义”。技术上,代码>结果是定义的实现,或者是一个实现定义的信号被提出< /C> >,不是未定义的。我认为有符号溢出完全是UB。@DeadMG:如果表达式的结果不能由表达式的类型(5/4)表示,则为UB;但是,如果结果不能表示,整数转换会给出一个实现定义的值(4.7/3)。@Dave:你引用的是C标准;在C++中,它只是“值是实现定义”。