I am trying to compile the below on RHEL 5.6 , 64 bit, and i keep getting a warning
"var.c:7: warning: format ‘%d’ expects
type ‘int’, but argument 2 has type
‘long unsigned int’"
Here is my code:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int n =10;
printf("The size of integer is %d\n", sizeof(n));
}
It does not matter if i change the declaration for "n" to following
- signed int n =10;
- int n = 10;
All i want to do is print the size of integer on my machine, without really looking into limits.h.
Best Answer
The sizeof function returns a
size_t
type. Try using%zu
as the conversion specifier instead of%d
.To clarify, use
%zu
if your compiler supports C99; otherwise, or if you want maximum portability, the best way to print asize_t
value is to convert it tounsigned long
and use%lu
.The reason for this is that the
size_t
is guaranteed by the standard to be an unsigned type; however the standard does not specify that it must be of any particular size, (just large enough to represent the size of any object). In fact, if unsigned long cannot represent the largest object for your environment, you might even need to use an unsigned long long cast and%llu
specifier.In C99 the z length modifier was added to provide a way to specify that the value being printed is the size of a size_t type. By using
%zu
you are indicating the value being printed is an unsigned value ofsize_t
size.This is one of those things where it seems like you shouldn't have to think about it, but you do.
Further reading: