#include <stdint.h> typedef /* ... */ int8_t; typedef /* ... */ int16_t; typedef /* ... */ int32_t; typedef /* ... */ int64_t; typedef /* ... */ uint8_t; typedef /* ... */ uint16_t; typedef /* ... */ uint32_t; typedef /* ... */ uint64_t; #define INT8_WIDTH 8 #define INT16_WIDTH 16 #define INT32_WIDTH 32 #define INT64_WIDTH 64 #define UINT8_WIDTH 8 #define UINT16_WIDTH 16 #define UINT32_WIDTH 32 #define UINT64_WIDTH 64 #define INT8_MAX /* 2**(INT8_WIDTH - 1) - 1 */ #define INT16_MAX /* 2**(INT16_WIDTH - 1) - 1 */ #define INT32_MAX /* 2**(INT32_WIDTH - 1) - 1 */ #define INT64_MAX /* 2**(INT64_WIDTH - 1) - 1 */ #define INT8_MIN /* - 2**(INT8_WIDTH - 1) */ #define INT16_MIN /* - 2**(INT16_WIDTH - 1) */ #define INT32_MIN /* - 2**(INT32_WIDTH - 1) */ #define INT64_MIN /* - 2**(INT64_WIDTH - 1) */ #define UINT8_MAX /* 2**INT8_WIDTH - 1 */ #define UINT16_MAX /* 2**INT16_WIDTH - 1 */ #define UINT32_MAX /* 2**INT32_WIDTH - 1 */ #define UINT64_MAX /* 2**INT64_WIDTH - 1 */ #define INT8_C(c) c ## /* ... */ #define INT16_C(c) c ## /* ... */ #define INT32_C(c) c ## /* ... */ #define INT64_C(c) c ## /* ... */ #define UINT8_C(c) c ## /* ... */ #define UINT16_C(c) c ## /* ... */ #define UINT32_C(c) c ## /* ... */ #define UINT64_C(c) c ## /* ... */
uintN_t are unsigned integer types of a fixed width of exactly N bits, N being the value specified in its type name. They are capable of storing values in the range [0, UINTN_MAX], substituting N by the appropriate number.
According to POSIX, [u]int8_t, [u]int16_t, and [u]int32_t are required; [u]int64_t are only required in implementations that provide integer types with width 64; and all other types of this form are optional.
The macros [U]INTN_WIDTH expand to the width in bits of these types (N).
The macros [U]INTN_MAX expand to the maximum value that these types can hold.
The macros INTN_MIN expand to the minimum value that these types can hold.
The macros [U]INTN_C() expand their argument to an integer constant of type [u]intN_t.
The length modifiers for the [u]intN_t types for the printf(3) family of functions are expanded by macros of the forms PRIdN, PRIiN, PRIuN, and PRIxN (defined in <inttypes.h>); resulting for example in %PRId64 or %PRIi64 for printing int64_t values. The length modifiers for the [u]intN_t types for the scanf(3) family of functions are expanded by macros of the forms SCNdN, SCNiN, SCNuN, and SCNxN, (defined in <inttypes.h>); resulting for example in %SCNu8 or %SCNx8 for scanning uint8_t values.