Christo S. Christov
Christo S. Christov

Reputation: 2309

Squaring a number in C++ yields wrong value

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

What is going on? I'm using VSC++ ( default VS c++ compiler )

Upvotes: 8

Views: 2170

Answers (3)

Jossie Calderon
Jossie Calderon

Reputation: 1425

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.

Upvotes: 23

Francis Cugler
Francis Cugler

Reputation: 7905

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.

Upvotes: 2

Dan
Dan

Reputation: 484

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.

Upvotes: 3

Related Questions