Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以构造一个确定二进制操作是否导致溢出的通用过程?_C++_Floating Point_Overflow_Addition - Fatal编程技术网

C++ 是否可以构造一个确定二进制操作是否导致溢出的通用过程?

C++ 是否可以构造一个确定二进制操作是否导致溢出的通用过程?,c++,floating-point,overflow,addition,C++,Floating Point,Overflow,Addition,我很好奇,是否可以编写一个像 template <typename T> bool overflows(T a, T b) { // ... Returns true or false depending on whether a+b overflows } 由于我没有计算机科学学位,我没有接受过任何关于程序应该如何处理溢出的正式教育,尽管我理解溢出的概念(如果我们的数字范围是,比如说,0,1,…,127,那么+运算在64+64,65+63,66,62等上“不起作用”)因为

我很好奇,是否可以编写一个像

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


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

因为你只问加法,您可以对定义了
numeric\u limits::max()
的类型执行此操作,并附加假设
a
b
中至少有一个为非负。(可能有一种解决方法,但我看不到一种简洁的方法。)

模板
布尔溢出(TA、TB)
{
如果(a
唯一一个
a+b
不是
~0
的值是
~0
本身对于C++中保证的N,定义了无符号算术2模n。有符号算术是。。。在浮点运算中,“
a+b
overflows”被定义为“
a+b==+inf
”。我不知道你还想要什么。但是你的
~0
让我觉得你对浮点不感兴趣,然后你应该选择一些你感兴趣的标记。我不知道这个问题的答案,但我会探索
decltype
。它返回对象的类型。根据对象的类型,可以推断出它可以正确存储的最大值。根据最大值,可以推断给定操作是否会溢出。
   bool overflows (unsigned int a, unsigned int b)
   {
       // ... returns true or false depending on whether a+b > ~0
   }
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;
}