C++ 在C+中添加大于long的数字+;

C++ 在C+中添加大于long的数字+;,c++,C++,我想加上两个数字,这是一个长整数可以容纳的最大值;然后打印出来。如果我不把sum的值存储在一个变量中,我就用“cout”打印它,那么我的计算机能打印它吗?代码如下所示: cout<<theLastValueOfLongLong + theLastValueOfLongLong; cout否,首先它计算(longlong的最小值+longlong的最小值)(这会导致溢出或冻结在可用的最大值),然后它将结果发送到cout。如果您不想溢出,则需要使用“long integer”库,例如您

我想加上两个数字,这是一个长整数可以容纳的最大值;然后打印出来。如果我不把sum的值存储在一个变量中,我就用“cout”打印它,那么我的计算机能打印它吗?代码如下所示:

cout<<theLastValueOfLongLong + theLastValueOfLongLong;

cout否,首先它计算
(longlong的最小值+longlong的最小值)
(这会导致溢出或冻结在可用的最大值),然后它将结果发送到
cout。如果您不想溢出,则需要使用“long integer”库,例如您可以执行任意长整数/f.p.操作,比如

#include <iostream>
#include <limits>

#include <boost/multiprecision/cpp_int.hpp>

int main()
{
   using namespace boost::multiprecision;

   cpp_int i; // multi-precision integer 

   i = std::numeric_limits<long long>::max();

   std::cout << "Max long long: " << i << std::endl; 
   std::cout << "Sum: " << i + i << std::endl;
}
#包括
#包括
#包括
int main()
{
使用名称空间boost::multiprecision;
cpp_int i;//多精度整数
i=std::numeric_limits::max();
std::cout它与:

long long temp = theLastValueOfLongLong + theLastValueOfLongLong;
cout << temp;
long-long-temp=long的最小值+long的最小值;

cout由于
long
已签名,因此加法溢出。这是未定义的行为,可能会发生任何情况。不太可能格式化硬盘,尤其是在这种简单的情况下


一旦发生了未定义的行为,就不能指望<代码> STD::CUT之后。

编译和尝试它如何?这可能是未定义的行为。C++版本叫做GMPXX。我想,如果你实际上是想表示更大的数字,那么发生的理论是UB和实现定义,所以。不太好question@SamiKuhmonen:您不能测试未定义的行为。这可能取决于愚蠢的不可控的事情,例如值是否来自寄存器,这反过来又取决于18个优化标志是否以正确的方式组合。我不知道boost multiprecision,我以前使用过gmp,我将尝试一下。@GradyPlay呃,我非常喜欢它,因为它使用起来非常简单,而且我认为它甚至可以用于一些更专业的任务。