Potrzebne jest tylko to, aby specyfikatory formatu i typy były zgodne i zawsze możesz rzutować, aby to było prawdą. longma co najmniej 32 bity, więc %lurazem z (unsigned long)kjest zawsze poprawne:
uint32_t k;
printf("%lu\n", (unsigned long)k);
size_tjest trudniejszy, dlatego %zuzostał dodany w C99. Jeśli nie możesz tego użyć, potraktuj to tak samo k( longjest największym typem w C89, size_tjest mało prawdopodobne, aby był większy).
size_t sz;
printf("%zu\n", sz); /* C99 version */
printf("%lu\n", (unsigned long)sz); /* common C89 version */
Jeśli specyfikatory formatu nie są prawidłowe dla typu, który przekazujesz, printfspowoduje to odczytanie zbyt dużej lub zbyt małej ilości pamięci z tablicy. Tak długo, jak używasz wyraźnych rzutów, aby dopasować typy, jest przenośny.
uint32_tz<stdint.h>lub<inttypes.h>; jeśli chcesz używać tych typów, powinieneś uaktualnić do C89. Jako rozszerzenie jest prawdopodobne, że GCC pozwala na ich użycie, ale C89 nie miał takiej obsługi.