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将存储更大数字的代码都是有缺陷的。因此,我们无法进行求和以查看它是否溢出,因为溢出时为时已晚。因此,请重新排列符号,使表达式的部分位于右侧。此外,他使用的是有符号整数(或