当前位置: 首页 > 知识库问答 >
问题:

防止加法的Int溢出?

冯皓
2023-03-14

在我的C代码中,我有:

int c=(a+b)/2;

我确信最终结果不会导致整数溢出,但这并不能保证(a b)

以下是我的错误信息:

第20行:Char 27:运行时错误:有符号整数溢出:1063376696 2126753390不能在类型'int'(solution.cpp)中表示摘要:未定义行为清理器:未定义行为prog_joined.cpp:31: 27

我如何解决这类问题?

共有3个答案

越飞翮
2023-03-14

只需使用int c=a(b-a)/2;如果a和b都是阳性。否则,您可以使用上述方法

颛孙正卿
2023-03-14

>

std::midpoint(a, b);

转换为可避免溢出的较大类型:

static_cast<int>((static_cast<std::int64_t>(a) + static_cast<std::int64_t>(b))/2);

使用特定于编译器的标志(例如-ftrapv)或内置标志(例如\uuuuuuu内置\uu添加\uu溢出)检测它:

if (__builtin_add_overflow(a, b, &result))
    throw std::out_of_range("overflow");

以避免溢出的方式执行计算(将其分为若干个案例,并找出在每种情况下避免溢出的方法):

using U = unsigned int;
return a>b ? a-(static_cast<U>(a)-b)/2 : a+(static_cast<U>(b)-a)/2;

https://godbolt.org/z/T3rPdq

阚砚文
2023-03-14

您可以使用64位整数执行该操作,然后将其转换回32位。

int c = int((std::int64_t(a) + std::int64_t(b)) / 2);
 类似资料:
  • JSFIDLE 如何阻止flexbox的子项溢出容器? 我不希望溢出设置为隐藏 超文本标记语言: CSS:

  • 这似乎是一件奇怪的事情,但是在Java中有没有办法阻止子类添加新方法(包括构造函数),同时仍然允许子类重写方法? 实际情况是,我们有一个带有一些抽象方法和构造函数的

  • 问题内容: 如果使用此代码,则div的圆角不会剪切图像(结果是图像的方形角覆盖了div的圆角): 有谁知道如何获得一个圆形的div来防止子图像溢出? 问题答案: 这可能会或可能不会在您遇到的情况下起作用,但请考虑使图像成为CSS背景。在FF3中,以下工作正常: 我不确定还有另一种解决方法-如果您对图像本身应用边框(例如,较深),则会遇到同样的方形角问题。 编辑: 尽管在“为图像添加边框”情况下,图

  • 问题内容: 我正在使用哈希函数,该函数返回一个。 然后,我想将其存储在仅支持(带符号的64位)的PostgreSQL中。 因为我对数字本身不感兴趣,但对二进制值(因为我将其用作检测唯一性的ID(我的值集为〜1000个值,一个64位的哈希值对我来说足够了)),我想通过“只是”更改类型将其转换为。 如何以一种使编译器满意的方式做到这一点? 问题答案: 您可以简单地使用类型转换: 输出: 转换为始终成功

  • 问题内容: 有没有办法用javascript / jquery防止图像加载?我正在从带有图像的html列表构建幻灯片。因此,我想收集所有src数据,然后阻止加载图像。因此,稍后当用户真正需要图像时,我便会加载它。 我在Google上找到了一些延迟加载脚本,但找不到阻止图像加载的方式。 提前致谢。 Edit1: 从答案看来,不可能使用javascript来防止图像加载。 这是一个执行延迟加载的脚本。

  • 可能重复: 如何检查在Java中相乘两个数字是否会导致溢出? 假设我有一个Java类方法,它使用和操作。 如何确保中没有发生溢出? 我想我可以使用BigDecimal,也可以用“包装器”替换all and*,比如: 有没有更好的方法来确保Java方法中不会发生int溢出?