御笔剑客 发表于 2018-1-30 23:42:46

关于溢出的问题

为什么在之后取模会溢出,而中途取模不会溢出呢?num在i等于某个值的时候已经大于了long long型最大值,那么后面的值不是溢出的值吗?为什么取余还能得到正确的结果呢?

#include <iostream>
using namespace std;

int main(){
    int n;
    cin>>n;
    long long num;
    num=0;
    num=1;
    for(int i=2;i<=n;i++)
    {
          num=(num+num);
      num=num%1000000007;
    }
    cout<<num;
}
这里          num=(num+num);
      num=num%1000000007;
        cout<<num<<endl;

不会溢出,但改成:
num=(num+num);
cout<<num%100007
就会溢出,为什么呢?

boot 发表于 2018-1-31 00:47:45

本帖最后由 boot 于 2018-1-31 00:52 编辑

溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。

如果你 ”中途取模“
num=num%1000000007;
就是让num取模后又重新赋值给num
可以说取模赋值后num没有一个大于1000000007的
自然不会溢出,数都已经变小了,都不是斐波那契了,结果谈何正确呀{:10_245:}

如果你 之后取模
cout<<num%100007<<endl;
这里只是单纯取模,当num超过2的63次方-1时,就溢出了

御笔剑客 发表于 2018-1-31 10:15:47

num=num%1000000007;表达式右边的num不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢?

御笔剑客 发表于 2018-1-31 10:16:19

boot 发表于 2018-1-31 00:47
溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。



num=num%1000000007;表达式右边的num不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢?

boot 发表于 2018-1-31 13:33:39

御笔剑客 发表于 2018-1-31 10:16
num=num%1000000007;表达式右边的num不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢?

如果他超过2的63次方-1,肯定要先超过1000000007。在超过1000000007时,取模赋值后,就比1000000007要小了,就是说所有的num都比1000000007要小。就算num前面两个数都是1000000006(这是假设,实际上不可能)想加赋值给num也没超过 2的63次方-1,没溢位。
由于这两个数相差太大,不会出现前一个数没超过1000000007,下一个数直接超过 2的63次方-1 的情况哦。
不知道你明白了吗,我可能说的不是很好理解。

{:10_245:}

人造人 发表于 2018-1-31 19:54:18

还是我的IDE好 ^_^


是这个代码吧?
看一看 变量 i
出了for循环,变量 i 还存在吗?
页: [1]
查看完整版本: 关于溢出的问题