c++ - 是否可以构造一个通用程序来判断二元运算是否会导致溢出?

标签 c++ floating-point overflow addition

我很好奇,是否可以编写一个像这样的包罗万象的实现

template <typename T> 
bool overflows(T a, T b)
{
  // ... Returns true or false depending on whether a+b overflows
}

????

如果没有,至少有人可以告诉我如何编写

的实现
   bool overflows (unsigned int a, unsigned int b)
   {
       // ... returns true or false depending on whether a+b > ~0
   }

???

因为我没有计算机科学学位,所以我没有接受过任何关于程序应该如何处理溢出的正规教育,尽管我理解溢出的概念(如果我们的数字范围是,比方说,0, 1,...,127,那么 + 操作在 64+64、65+63、66,62 等上不起作用)

最佳答案

由于您只询问加法,因此您可以使用 numeric_limits<T>::max() 对类型进行加法与附加假设一起定义,即至少有一个 ab是非负的。 (可能有一种方法可以解决它,但我没有看到一个简洁的方法。)

template <typename T> 
bool overflows(T a, T b)
{
  if(a < b) return overflows(b,a);
  //Since we assumed at least one is non-negative, this now makes sense.
  return b < std::numeric_limits<T>::max() - a;
}

关于c++ - 是否可以构造一个通用程序来判断二元运算是否会导致溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29267787/

相关文章:

c++ - 我有一个指向参数化函数的指针的成员,我可以扩展参数类型吗?

c++ - 为什么 friend 类成员可以通过公共(public)继承类的对象访问它成为 friend 的类的私有(private)成员?

c++ - 如何追踪导致段错误的原因?

C++ IsFloat 函数

html - 由于空白 : nowrap;,内联 block 无法正常工作

HTML Object标签去除滚动条溢出

c++ - 如何根据动态属性对项目进行排序?

c# - 比较从 double 转换的小数是否安全

perl - 如何在 Perl 中将 float 转换为十六进制字符串?

css - 隐藏垂直滚动条但仍然滚动 Firefox/IE/Edge