Reputation: 19749
I am trying this code on GNU's C++ compiler and am unable to understand its behaviour:
#include <stdio.h>;
int main()
{
int num1 = 1000000000;
long num2 = 1000000000;
long long num3;
//num3 = 100000000000;
long long num4 = ~0;
printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
printf("%d %ld %lld %llu", num1, num2, num3, num4);
return 0;
}
When I uncomment the commented line, the code doesn't compile and is giving an error:
error: integer constant is too large for long type
But, if the code is compiled as it is and is executed, it produces values much larger than 10000000000.
Why?
Upvotes: 90
Views: 298669
Reputation: 9
Note:
Replace these things and you are good to go :)
Upvotes: 0
Reputation: 28087
It depends in what mode you are compiling. long long is not part of the C++ standard but only (usually) supported as extension. This affects the type of literals. Decimal integer literals without any suffix are always of type int if int is big enough to represent the number, long otherwise. If the number is even too big for long the result is implementation-defined (probably just a number of type long int that has been truncated for backward compatibility). In this case you have to explicitly use the LL suffix to enable the long long extension (on most compilers).
The next C++ version will officially support long long in a way that you won't need any suffix unless you explicitly want the force the literal's type to be at least long long. If the number cannot be represented in long the compiler will automatically try to use long long even without LL suffix. I believe this is the behaviour of C99 as well.
Upvotes: 6
Reputation: 23168
Try:
num3 = 100000000000LL;
And BTW, in C++ this is a compiler extension, the standard does not define long long, thats part of C99.
Upvotes: 28
Reputation: 33596
your code compiles here fine (even with that line uncommented. had to change it to
num3 = 100000000000000000000;
to start getting the warning.
Upvotes: 2
Reputation: 399703
The letters 100000000000 make up a literal integer constant, but the value is too large for the type int
. You need to use a suffix to change the type of the literal, i.e.
long long num3 = 100000000000LL;
The suffix LL
makes the literal into type long long
. C is not "smart" enough to conclude this from the type on the left, the type is a property of the literal itself, not the context in which it is being used.
Upvotes: 155