C++ 整数加法中的溢出测试

C++ 整数加法中的溢出测试,c++,C++,可能重复: 我曾尝试实现一个简单的程序,用于测试整数加法过程中是否发生溢出: #include <climits> #include <iostream> #include <string> using namespace std; string overflow(long a,long b){ return ((a+b)>UINT_MAX)?"true":"false"; } int main(){ long a, b;

可能重复:

我曾尝试实现一个简单的程序,用于测试整数加法过程中是否发生溢出:

#include <climits>
#include <iostream>
#include <string>

using namespace std;

string overflow(long a,long b){
    return ((a+b)>UINT_MAX)?"true":"false";
}

int main(){
    long a, b;
    cout << "enter a and b: ";
    cin >> a >> b;
    string m = overflow(a,b);
    cout << m;

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
字符串溢出(长a、长b){
返回((a+b)>UINT_MAX)?“真”:“假”;
}
int main(){
长a,b;
cout>a>>b;
字符串m=溢出(a,b);

cout给定
无符号整数a,b
,此表达式的计算结果永远不能为

(a+b) > UINT_MAX
它永远不可能是
true
的原因是
UINT\u MAX
是最大值,因此无论
(a+b)
的结果是什么,都不能大于
UINT\u MAX
,因为这将是一个矛盾

<>你尝试使用一个更大的数据类型<代码>长< /Cord>来绕过这个问题,但是实际上这并不能保证在C++中比int >代码>要大。你可以尝试使用<代码>长Lo/<代码>(虽然这个类型不存在于标准C++中)。

不同于,例如,java,C++实际上没有指定每个数据类型必须有多大,因此,“代码> uTunnMax=65535</CODE”的说法并不普遍。对于无符号整数的处理器,只有16位,只有32位,<代码> UTIN最大值 <代码> 4294967295 < /C> > 相关问题

另见

给定
无符号整数a,b
,此表达式的计算结果永远不能为

(a+b) > UINT_MAX
它永远不可能是
true
的原因是
UINT\u MAX
是最大值,因此无论
(a+b)
的结果是什么,都不能大于
UINT\u MAX
,因为这将是一个矛盾

<>你尝试使用一个更大的数据类型<代码>长< /Cord>来绕过这个问题,但是实际上这并不能保证在C++中比int >代码>要大。你可以尝试使用<代码>长Lo/<代码>(虽然这个类型不存在于标准C++中)。

不同于,例如,java,C++实际上没有指定每个数据类型必须有多大,因此,“代码> uTunnMax=65535</CODE”的说法并不普遍。对于无符号整数的处理器,只有16位,只有32位,<代码> UTIN最大值 <代码> 4294967295 < /C> > 相关问题

另见

您使用的编译器是什么

在大多数系统中,整数是32位有符号类型,表示+/-21亿(给定或获取一对)


65535是一个16位的值,所以向它添加20不会有多大作用,但我很惊讶它会给出false。

您使用的是什么编译器

在大多数系统中,整数是32位有符号类型,表示+/-21亿(给定或获取一对)

65535是一个16位的值,所以向它添加20不会有多大作用,但我很惊讶它会给出false。

试试这个:

return ((a+b)>(long)UINT_MAX)?"true":"false";
另外,请确保UINT_MAX的实际值为65535,而不是更大的值。

试试这个:

return ((a+b)>(long)UINT_MAX)?"true":"false";
unsigned int a = UINT_MAX;
unsigned int b = 20;

unsigned int c = a+b;

cout << c << endl;

//output
19
另外,确保UINT_MAX真的是65535,而不是更大的值。

unsigned int a=UINT_MAX;
unsigned int a = UINT_MAX;
unsigned int b = 20;

unsigned int c = a+b;

cout << c << endl;

//output
19
无符号整数b=20; 无符号整数c=a+b; cout
无符号整数a=UINT\u MAX;
无符号整数b=20;
无符号整数c=a+b;
可能有很多问题:

65535是2^16或2字节,其中as long通常是4字节长或2^32。您可以将程序更改为使用short,short通常是2字节长

一些编译器现在为long提供2^64(long必须至少为2^32,但可以更大)。类似的规则也适用于short

您使用的是带符号的long,这意味着一位用于表示符号,因此即使使用shorts,输入65535实际上也是-1的值(因此更改为使用无符号的shorts)

如果你把两个未签名的空头加在一起,并把答案放在一个空头中,总数永远不会超过65535,因为空头不能表示这么大的值。

很多问题:

65535是2^16或2字节,其中as long通常是4字节长或2^32。您可以将程序更改为使用short,short通常是2字节长

一些编译器现在为long提供2^64(long必须至少为2^32,但可以更大)。类似的规则也适用于short

您使用的是带符号的long,这意味着一位用于表示符号,因此即使使用shorts,输入65535实际上也是-1的值(因此更改为使用无符号的shorts)

如果你把两个未签名的空头加在一起,把答案放在一个空头里,总数永远不会超过65535,因为一个空头不能表示那么大的值。

两件事

  • 检查long的大小-如果它与int相同,则(a+b)将始终小于或等于UINT_MAX

  • UINT_MAX=4294967295表示4位整数

  • 这完全取决于平台

    两件事

  • 检查long的大小-如果它与int相同,则(a+b)将始终小于或等于UINT_MAX

  • UINT_MAX=4294967295表示4位整数

  • 它完全依赖于平台

    请尝试:

    string overflow(unsigned int a,unsigned int b)
    { 
        return ((a > (std::numeric_limits<unsigned int>::max() - b))?"true":"false"; 
    } 
    
    字符串溢出(无符号整数a、无符号整数b)
    { 
    返回((a>(std::numeric_limits::max()-b))?“true”:“false”;
    } 
    
    请记住,不能保证long大于int,因此任何假定long将存储更大的数字的代码都是有缺陷的。因此,我们无法进行求和以查看它是否溢出,因为当它溢出时,为时已晚。因此,请重新排列符号,使表达式的部分位于右侧。

    尝试:

    string overflow(unsigned int a,unsigned int b)
    { 
        return ((a > (std::numeric_limits<unsigned int>::max() - b))?"true":"false"; 
    } 
    
    字符串溢出(无符号整数a、无符号整数b)
    { 
    返回((a>(std::numeric_limits::max()-b))?“true”:“false”;
    } 
    

    请记住,不能保证long大于int,因此任何假定long将存储更大数字的代码都是有缺陷的。因此,我们无法进行求和以查看它是否溢出,因为溢出时为时已晚。因此,请重新排列符号,使表达式的部分位于右侧。

    此外,他使用的是有符号整数(或