C ++下溢和溢出

时间:2012-04-04 12:45:35

标签: c++

嗨,我是新来的,所以如果出现任何问题,请告诉我,下次我会努力做得更好。

我试图了解C ++中的下溢和溢出是如何工作的。我的理解是如果超出变量的范围,它将从范围的另一端开始。因此,如果short的最小值为-32768,并且如果我们对它执行-1,则新值应为SHRT_MAX。(32767) 这是我的代码:

#include<iostream.h>
#include<limits.h>
#include<conio.h>
int main ( void )
{
 int testpositive =INT_MIN ;
 short testnegative = SHRT_MIN ; 
 cout<< SHRT_MIN<<"\n";
 cout << testnegative-1<<"\n";
 cout << INT_MIN << "\n";
 cout << testpositive-1 << "\n"; 
 cout<<testpositive-2;
 getch();
 return 0;
}   

4 个答案:

答案 0 :(得分:6)

仅为unsigned类型指定溢出/下溢的确切行为。对于普通的有符号整数类型而言,C ++标准只是简单地说可以发生任何事情。

如果我们谈论的是x86处理器(或大多数其他现代处理器),那么行为正是您描述的行为,对于CPU而言,签名值或无符号值之间没有区别(有签名和未签名的操作,但值本身只是位。)

请注意,编译器可以假设(并且大多数现代优化器编译器实际上都假设)在正确的程序中不会发生有符号整数溢出,例如在代码中:

int x = foo();
int y = x + 1;
if (x < y) {
    do_something();
} else {
    do_something_else();
}

编译器可以完全跳过测试和生成代码中的else分支,因为在有效程序中,带符号的int x总是小于x+1(因为签名溢出)不能被视为有效行为)。 如果将int替换为unsigned int,则编译器必须为测试和else分支生成代码,因为对于无符号类型,可能x > x+1

答案 1 :(得分:2)

通常是的。但由于这是C ++,并且C ++受C ++标准的约束,您必须知道溢出是未定义的行为

虽然您所说的内容可能适用于大多数平台,但它并不能保证,所以不要依赖它。

答案 2 :(得分:1)

新值不一定是SHRT_MAX未定义。

答案 3 :(得分:1)

有符号溢出是C ++中未定义的行为。

例如:

INT_MIN - 1

-INT_MIN

是调用未定义行为的表达式。

在具有16位SHRT_MIN - 1和32位-SHRT_MIN的环境中,

shortint不是未定义的行为,因为使用整数提升操作数将被提升为{{ 1}}首先。在具有16位intshort的环境中,这些表达式也是未定义的行为。