I have a problem while using the printf
function to print values of type unsigned long long int
I have no idea what's wrong. I'm using Dev-Cpp 4.9.9.2 and Visual Studio 2010 Professional (I know that it's not C compiler, but anyway, wanted to try) on Windows 7 Professional 64-bit. For displaying, I used %llu
modifier (according to How do you printf an unsigned long long int(the format specifier for unsigned long long int)?) but I also tried I64d with no effect...
Firstly, I just wanted to print minimum and maximum value of unsigned long long int
(using ULONG_MAX
from limits.h
)
printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
Returns:
unsigned long long int: 18446744069414584320 to 1580552164021 (Dev-Cpp)
unsigned long long int: 18446744069414584320 to 0 (Visual Studio)
Then I tried to using printf
to print two zeros
printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);
Returns:
unsigned long long int: 0 to 1580552164021 (Dev-Cpp)
unsigned long long int: 0 to 0 (Visual Studio)
Also tried two ULONG_MAX
values
printf("unsigned long long int: \n%llu to %llu \n\n", ULONG_MAX, ULONG_MAX);
Returns:
unsigned long long int: 18446744073709551615 to 1580552164021 (Dev-Cpp)
unsigned long long int: 18446744073709551615 to 0 (Visual Studio)
Why does it behave like that? Could you explain it to me?
This is wrong:
You use a
unsigned long long
format specifier, but you pass anint
and anunsigned long
value. Promotion rules mean you can be sloppy for everythingint
-sized or smaller, which does not apply tolong long
.Use casts:
Explanation: When passing arguments to
printf
, any type that can fit in anint
is promoted toint
, and then any type that can fit in anunsigned int
is promoted tounsigned int
. It is also okay to pass an unsigned type to a signed format specifier or vice versa as long as the value passed can be represented using the type specified by the format specifier.So you must be careful with
long
andlong long
, but you can be sloppy withint
,short
, andchar
.Most compilers have settings to make them warn you about this type of error, since it can be detected at compile-time fairly easily; GCC and Clang have
-Wformat
which results in the following warnings: