In C, the inttypes.h header file provides format specifiers for integer types defined in stdint.h that can be used with printf() and scanf(). Here are the four types of integer types available:

  1. Fixed-width integer types, e.g., int8_t
  2. Minimum-width integer types, e.g., int_least8_t
  3. Fastest minimum-width integer types, e.g., int_fast8_t
  4. Maximum-width integer types, e.g., intmax_t

The format specifiers for printf() are formed by combining PRI + original specifier + type keyword/width. For example, if the original specifier is %d, the format specifiers are as follows:

  • PRIdn (fixed-width types)
  • PRIdLEASTn (minimum-width types)
  • PRIdFASTn (fastest minimum-width types)
  • PRIdMAX (maximum-width types)

The n in these specifiers can be replaced with 8, 16, 32, or 64, depending on the integer width.

Here is an example of how to use these specifiers:

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void) {
int_least16_t x = 3490;
printf("The value is %" PRIdLEAST16 "!\n", x);
}

In this example, PRIdLEAST16 is used to match the type int_least16_t, with the original specifier %d. Note that the first argument in printf() uses concatenated strings.

Here are the format specifiers for other original placeholders:

  • %i: PRIin, PRIiLEASTn, PRIiFASTn, PRIiMAX
  • %o: PRIon, PRIoLEASTn, PRIoFASTn, PRIoMAX
  • %u: PRIun, PRIuLEASTn, PRIuFASTn, PRIuMAX
  • %x: PRIxn, PRIxLEASTn, PRIxFASTn, PRIxMAX
  • %X: PRIXn, PRIXLEASTn, PRIXFASTn, PRIXMAX

The scanf() format specifiers follow a similar pattern:

  • %d: SCNdn, SCNdLEASTn, SCNdFASTn, SCNdMAX
  • %i: SCNin, SCNiLEASTn, SCNiFASTn, SCNiMAX
  • %o: SCNon, SCNoLEASTn, SCNoFASTn, SCNoMAX
  • %u: SCNun, SCNuLEASTn, SCNuFASTn, SCNuMAX
  • %x: SCNxn, SCNxLEASTn, SCNxFASTn, SCNxMAX

These conventions ensure that the correct specifier is used for each integer type, making the code more portable and readable.