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;
}