views:

4434

answers:

4
+8  Q: 

long long in C/C++

Hi All,
I am trying this code on GNU c++ compiler and 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 compiles giving error
error: integer constant is too large for long type

But, if the code is compiled as it is, and executed it produces values much larger than 10000000000.

Can anyone explain why?

Thanks,

+24  A: 

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.

unwind
+11  A: 

Try:

num3 = 100000000000LL;

And BTW, in C++ this is a compiler extension, the standard does not define long long, thats part of C99.

Arkaitz Jimenez
A: 

your code compiles here fine (even with that line uncommented. had to change it to

num3 = 100000000000000000000;

to start getting the warning.

Omry
What compiler? In C++, an integer literal is the smaller of int or long that it fits in. In C99, it's the smallest of int, long, long long. So when bolting long long on to C++ as a non-standard extension, perhaps your compiler has also adopted the C99 rules for literals.
Steve Jessop
gcc version 4.3.2 (Debian 4.3.2-1.1) on a 64bit linux system.
Omry
Oh, so long is 64 bit anyway, right? Makes sense.
Steve Jessop
A: 

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.

sellibitze