嗨,我是新来的,所以如果出现任何问题,请告诉我,下次我会努力做得更好。
我试图了解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;
}
答案 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
的环境中, short
和int
不是未定义的行为,因为使用整数提升操作数将被提升为{{ 1}}首先。在具有16位int
和short
的环境中,这些表达式也是未定义的行为。