C++ Isn';一系列整数的和总是整数吗?(Stroustrup PPP——第5章,问题9)

C++ Isn';一系列整数的和总是整数吗?(Stroustrup PPP——第5章,问题9),c++,C++,问题9: 修改练习8中的程序,如果结果不能表示为int,则写出一个错误 为了给问题9提供更多的上下文,这里是问题8: 编写一个程序,读取并存储一系列整数,然后计算前N个整数的和。首先求N,然后将值读入向量,然后计算前N个值的总和 所以我的问题是: 如果我有一个整数向量,并且我对向量中的元素求和,我的结果不总是整数吗?如果是,Stroustrup PPP中的问题9要求什么? *如果有帮助,请参阅问题8的代码。是的,结果将始终是一个整数,但它可能不是“正确”的解决方案,因为存在溢出 例如,如果您的整

问题9:

修改练习8中的程序,如果结果不能表示为int,则写出一个错误

为了给问题9提供更多的上下文,这里是问题8:

编写一个程序,读取并存储一系列整数,然后计算前N个整数的和。首先求N,然后将值读入向量,然后计算前N个值的总和

所以我的问题是:

如果我有一个整数向量,并且我对向量中的元素求和,我的结果不总是整数吗?如果是,Stroustrup PPP中的问题9要求什么?


*如果有帮助,请参阅问题8的代码。

是的,结果将始终是一个整数,但它可能不是“正确”的解决方案,因为存在溢出

例如,如果您的整数类型只能表示-3到4,并且您将2和3相加,那么正确的结果是什么?5,但整数结果可以是-3(假设为2个补码有符号整数)。这就是你需要检测的


这只是解决方案的一个迹象<代码>数值限制::max()是您可以表示的最大值。如果您当前的和是
sum
,而新的值是
value
,那么关于溢出的
max-value
sum
,您能说些什么呢?

实际上,从数学上讲,整数集是在加法下闭合的

< > > C++的<代码> INT/COM>由NoimiCyLime::MINUL>(<代码> >和NoimixLime::Max())/Cuff>约束。超出此范围的行为未定义

如果我有一个整数向量,我对向量中的元素求和,我的结果不总是整数吗


它将是一个整数,是的。但作为一个整数并不一定意味着它可以用
int
表示。你看,
int
可以表示的数字范围有限。任务是找出结果是否在该范围内

大概是询问该值是否超过ah ic。在这种情况下,我不能简单地做一个“if(sum>numeric_limits::max())…”,因为如果它溢出,sum就会变成负整数,对吗?确切地说,您需要做更多的事情。在我更新的答案中有一些提示。太棒了!谢谢!有符号溢出是UB,因此
5==-3
只是UB的一种可能结果。是的,但在-3到4的整数范围内,就是这样。UB与1-补体比2-补体有关。在特定的体系结构上,行为是精确定义的。我现在理解了这个问题。干杯知道了!谢谢这项任务的棘手部分是,在计算答案之前,您需要确定答案是否在范围内。