86

I am new to C and I am confronted with:

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    uint64_t foo = 10;
    printf("foo is equal to %" PRIu64 "!\n", foo);
    
    return 0;
}

And it works! I don't understand why. Can somebody help me about this?

0

1 Answer 1

103

PRIu64 is a format specifier, introduced in C99, for printing uint64_t, where uint64_t is (from linked reference page):

unsigned integer type with width of ... 64 bits respectively (provided only if the implementation directly supports the type)

PRIu64 is a string (literal), for example the following:

printf("%s\n", PRIu64);

prints llu on my machine. Adjacent string literals are concatenated, from section 6.4.5 String literals of the C99 standard:

In translation phase 6, the multibyte character sequences specified by any sequence of adjacent character and wide string literal tokens are concatenated into a single multibyte character sequence. If any of the tokens are wide string literal tokens, the resulting multibyte character sequence is treated as a wide string literal; otherwise, it is treated as a character string literal.

This means:

printf("foo is equal to %" PRIu64 "!\n", foo);

(on my machine) is the same as:

printf("foo is equal to %llu!\n", foo);

See http://ideone.com/jFvKR9 .

1
  • 6
    @torr It depends upon the choices made by your hardware, OS, compiler and library (collectively called "the implementation") as to whether or not PRIu64 expands to "llu". On some implementations it may expand to "u", instead, meaning that "%u" would be appropriate for printing uint64_t values. That shouldn't be relied upon, however. There are no other portable ways to print uint64_t values that you'd be happy with.
    – autistic
    May 31, 2013 at 14:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.