c++literalsinteger-overflowlong-long

3 * 1000000000 overflows as an int, but the variable is long long. Why?


I have a simple c++ app that performs the following calculations

long long calcOne = 3 * 100000000;     // 3e8, essentially
long long calcTwo = 3 * 1000000000;    // 3e9, essentially
long long calcThree = 3 * 10000000000; // 3e10, essentially

If I write the result of each calculation I get the following output:

calcOne = 300000000
calcTwo = -1294967296
calcThree = 30000000000

So why does the second calculation fail? As far as I can tell it is within the limits of a long long type (calcThree was larger...).

I am using Visual Studio 2015 on Windows 10. Thanks in advance.


Solution

  • Integer constants are, by default ints.

    1000000000
    

    That can fit into an int. So, this constant gets parsed as an int. But multiplying it by 3 overflows int.

    10000000000
    

    This is too big to an int, so this constant is a long long, so the resulting multiplication does not overflow.

    Solution: explicitly use long long constants:

    long long calcOne = 3 * 100000000LL;     // 3e8, essentially
    long long calcTwo = 3 * 1000000000LL;    // 3e9, essentially
    long long calcThree = 3 * 10000000000LL; // 3e10, essentially