Squaring a number in C++ yields wrong value

后端 未结 3 1231
臣服心动
臣服心动 2021-01-05 02:14

If I do

 int n = 100000;
 long long x = n * n;

then x == 1410065408

1410065408 is 2^31, yet I expect x to be 64 bit

相关标签:
3条回答
  • 2021-01-05 02:50

    Edit - This is another solution to the problem; what this will do is cast the integer values to a long long before the multiplication so you don't get truncation of bits.

    Original Posting

    int n = 100000;
    long long x = static_cast<long long>( n ) * static_cast<long long>( n );
    

    Edit - The original answer provided by Jossie Calderon was already accepted as a valid answer and this answer adds another valid solution.

    0 讨论(0)
  • 2021-01-05 02:52

    Declaring n as a long long is the best solution as mentioned previously.

    Just as a quick clarification to the original post, 1410065408 is not 2^31, the value comes about as follows:

    100,000 ^ 2 = 10,000,000,000 which exists in binary form as:

    10 0101 0100 0000 1011 1110 0100 0000 0000

    C++ integers are strictly 32 bits in memory. Therefore, the front two bits are ignored and the value is stored in memory as binary:

    0101 0100 0000 1011 1110 0100 0000 0000

    In decimal, this is equal to exactly 1410065408.

    0 讨论(0)
  • 2021-01-05 02:54

    n*n is too big for an int because it is equal to 10^10. The (erroneous) result gets stored as a long long.

    Try:

    long long n = 100000;
    long long x = n*n;
    

    Here's an answer that references the standard that specifies that the operation long long x = (long long)n*n where n is an int will not cause data loss. Specifically,

    If both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank shall be converted to the type of the operand with greater rank.

    Since the functional cast has the highest precedence here, it converts the left multiplicand to a long long. The right multiplicand of type int gets converted to a long long according to the standard. No loss occurs.

    0 讨论(0)
提交回复
热议问题