为什么长时间溢出?

2021-02-25 14:30

long long int n=2000*2000*2000*2000;long long int n=pow(2000,4);为什么第一个溢出而第二个不溢出?

解答动态

  • 2000是一个通常为32位的整数。只用2000ll。或2000LL,正如@AdrianMole所建议的那样。
    默认情况下,文本是可以保存其值但不小于int的最小类型。2000可以很容易地存储在int中,因为标准保证它至少是16位类型。
    算法总是使用expressin中存在的最大类型执行,但不小于int-sochar*char将在乘法之前提升为int,但类型不取决于结果是否可以存储在推断类型中。这是在你的情况下发生的事情——乘法是用INTS完成的,但是结果溢出。2 C++不支持基于Haskell CAN的目的地推断类型。
    。在第一行代码的RHS上的常量(文字)是int值(不是长It)。因此,多重应用程序是使用int算法执行的,它将溢出。
    要解决这个问题,请使用LL使常量变长后缀:
    longint n=2000LL*2000LL*2000LL*2000LL; cppreference

    • 2000*2000*2000*2000是4个int值的乘积,它返回一个int值。当您将这个int值赋给long long int n时,溢出已经发生(如果int是32位,则结果值将不适合)。
      您需要确保不会发生溢出,因此当您编写
      long long long int n=(long long int)2000*2000*2000*2000时; 确保正在执行long long int乘法(long long int乘以int返回long long int,因此在您的情况下没有溢出)。这里很重要:转换为long long int的优先级高于乘法,因此这相当于to
      long long int n=((long long int)2000)*2000*2000*2000; 一个更短(更好的方法)是写2000LL或2000LL,而不是旧的C样式转换(long long int)2000,后者也会触发编译器警告(brace init是首选,但是这对long int不起作用,long int在一行中有三个标识符,而不是一个标识符)。这使整型文字具有正确的类型。对于适合整数的2000,不需要这样做,但是对于不适合整数的更高值,则需要这样做。
      long-long-int n=2000LL*2000*2000*2000;long-long-int n=2000LL*2000LL*2000LL*2000LL;

      • 第一个是使用32位整数的乘法。然后将结果转换为long long int。由于32位整数无法存储2000^4,因此结果溢出。
        第二个调用pow函数,该函数将第一个参数转换为double并返回double。然后将结果转换为long long int。在这种情况下没有溢出,因为数学是在双精度值上完成的。

        • End

        免责声明:

        本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。