
当输入为正值时,代码的任何输出都是负值?
using namespace std;
int aa(int n) //
{
int i=0;
for(i=n;i>0;i--)
{
i=i*(i-1); //body
}
return i; //returning i
}
int main()
{
cout<<aa(8); //function call
return 0;
}
每当执行上面这行代码时,为什么我得到的是一个负值?在int range交叉后,应该给出一个垃圾值,垃圾值可以是任何东西。不应该一定是负值。
投票
当n小于或等于2时,返回值0。负值不进入循环,1和2的结果为 i=0)当大于2时,i的值会因为线的关系而快速增长。i = i*(i-1),直到它溢出。如果溢出结果-1(因为i--)是正数,循环继续进行新的 i. 因为测试条件是有效的,所以快速增长不可避免地继续下去,并导致越来越多的溢出,最终将导致当减少的1个值(i--)为零或负时,测试条件不能通过,for循环结束,并导致 i 被返回。
因此,正值 不能 退而求其次 i 可能是正的溢出结果(当溢出结果为1,并由i--降为0时)。
观察aa(8)的特殊情况。 首先调用aa(8).创建int i并赋值为0.for循环开始.i变成8,8 > 0所以我们执行正文里面的命令,并设置i为8*7=56我们到达for的终点,所以我们执行i--,i变成55。
我们再次检查测试条件,55 > 0,所以我们执行命令i = 55*54再次结束for块,我们执行i--所以i = 2969。
我们检查测试条件,2969 > 0所以我们执行命令,i=2969*2968,我们执行i--所以i=8881991。
8881991 > 0,所以我们执行体i=8881991*8881990,现在出现了溢出,i变成了负数,这个数就会减少i--。
但现在测试条件i > 0为假,循环结束。
i被返回。
溢出结果一个int溢出的结果可以是其范围内的任何一个数字。
比方说,我们从零开始数,来表示所说的数字。
溢出后产生的第一个数字是。
cout << INT_MAX+1;
输出: -2147483648 (INT_M) -2147483648 (INT_MIN)
我们可以从这里开始进一步计算,所以结果可以是INT_MIN &INT_MAX之间的任何一个数字,测试。
cout << INT_MAX+n
当n在[1 (INT_MIN), 1+INT_MAX+1(0直到这里)+INT_MAX(最大)]范围内时。
再一次达到INT_MAX,我们可以像之前一样继续计算......