-Woverflow catn cout值

-Woverflow catn cout value

我刚开始编程并编写了以下代码,但由于某种原因,它没有显示正确的值,尽管我几乎可以肯定我对值类型的杀伤力太大了​​。

#include <limits>
#include <iostream>

int main() {
    unsigned long long int imin = std::numeric_limits<unsigned long long int>::min(); // minimum value
    unsigned long long int imax = std::numeric_limits<unsigned long long int>::max(); // maximum value

    std::cout << imin << " " << imax << std::endl;

    unsigned long long int a;
    a = 45*44*43*42*41*40;
    std::cout << "die wahrscheinlichkeit ist: 1:"  << a << std::endl;
    return 0;
}

当我编译它时,我得到这个:

0 18446744073709551615
die wahrscheinlichkeit ist: 1:1569475904

Process finished with exit code 0

和这个警告:

Warnung: Ganzzahlüberlauf in Ausdruck [-Woverflow]
a = 45*44*43*42*41*40;

翻译一下,意思是表达式中的整数溢出(或类似的东西)。

当我使用普通计算器时,我得到这个 5864443200。

我正在使用 C++14。

问题确实是您的普通 int 数字发生了溢出。你的声明很好,除了在计算中。数字 40、41、42、43、44 和 45 是具有各自长度的正常整数。它们像普通整数一样相乘,当数字变大时就会发生溢出。计算完成后(溢出已经发生),数字被转换为 unsigned long long int。

因此,使数字也成为 long long unsigned 类型,并带有 LLU 后缀:

a = 45LLU * 44LLU * 43LLU * 42LLU * 41LLU * 40LLU;

这将解决您的问题。