printf with sizeof on 32 vs 64 platforms: how do I handle format code in platform independent manner?

Portable printf identifiers are provided in the include file inttypes.h or here.

This include file has many portable identifiers for your specific runtime. For your example, you want PRIuPTR, which means "PRintf Identifier unsigned with size of up to a pointer's size".

Your example will then be:

printf("The amount of RAM used is %" PRIuPTR, anIntVariable*sizeof(double) );

Results on 64bit Linux with GCC 4.3 (int anIntVariable = 1):

$ gcc test.c -m32 -o test && ./test
The amount of RAM used is 8
$ gcc test.c -o test && ./test
The amount of RAM used is 8

For completeness sake, there are identifiers for scanf too, whose prefixes are SCN.


The return value of sizeof is a size_t. If you're using a C99 compliant compiler it looks like you can use %zd%zu for this.

D'oh: %zu (unsigned) of course. Thanks, ony.


First of all, you should match the "%" specifier with the actual data type you want to print. sizeof returns the data type size_t, and just as you shouldn't try to print a float using a "%d" specifier, you shouldn't try to print a size_t with "%u" or "%d" or anything that doesn't really mean size_t.

The other replies have given some good ways to handle this with newer compilers ("%z" and PRIu32), but the way we used to do this was simply to cast the size_t to unsigned long, and then print it using "%lu":

printf("The amount of RAM used is %lu", (unsigned long)(anIntVariable*sizeof(double)) );

This will not work on systems where size_t is wider than a long, but I don't know of any such systems, and I'm not even sure if the standard allows it.

Tags:

C

32Bit 64Bit