Fixed width integer types (since C++11)
Types
For each of the following typedef names marked (optional), an implementation defines it if and only if the implementation provides a corresponding type.
Defined in header
<cstdint> | |
int8_tint16_tint32_tint64_tintN_t (optional)(optional)(optional)(optional)(optional) |
signed integer type with width of exactly N (typically 8, 16, 32 or 64) bits and no padding bits (typedef) |
int_fast8_tint_fast16_tint_fast32_tint_fast64_tint_fastN_t (optional) |
fastest signed integer type with width of at least N (typically 8, 16, 32 or 64) bits (typedef) |
int_least8_tint_least16_tint_least32_tint_least64_tint_leastN_t (optional) |
smallest signed integer type with width of at least N (typically 8, 16, 32 or 64) bits (if std::intN_t is defined, std::int_leastN_t designates the same type) (typedef) |
intmax_t |
maximum-width signed integer type (typedef) |
intptr_t (optional) |
signed integer type capable of holding a pointer to void (typedef) |
uint8_tuint16_tuint32_tuint64_tuintN_t (optional)(optional)(optional)(optional)(optional) |
unsigned integer type with width of exactly N (typically 8, 16, 32 or 64) bits and no padding bits (typedef) |
uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_tuint_fastN_t (optional) |
fastest unsigned integer type with width of at least N (typically 8, 16, 32 or 64) bits (typedef) |
uint_least8_tuint_least16_tuint_least32_tuint_least64_tuint_leastN_t (optional) |
smallest unsigned integer type with width of at least N (typically 8, 16, 32 or 64) bits (if std::uintN_t is defined, std::uint_leastN_t designates the same type) (typedef) |
uintmax_t |
maximum-width unsigned integer type (typedef) |
uintptr_t (optional) |
unsigned integer type capable of holding a pointer to void (typedef) |
Macro constants
For each of the following macros marked (conditionally present), an implementation defines it if and only if the implementation defines the corresponding typedef name.
Defined in header
<cstdint> | |
Signed integers : bit width | |
INTN_WIDTH (C++26)(conditionally present) |
bit width of std::intN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INT_FASTN_WIDTH (C++26)(conditionally present) |
bit width of std::int_fastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INT_LEASTN_WIDTH (C++26)(conditionally present) |
bit width of std::int_leastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INTMAX_WIDTH (C++26) |
bit width of std::intmax_t (macro constant) |
INTPTR_WIDTH (C++26)(conditionally present) |
bit width of std::intptr_t (macro constant) |
Signed integers : minimum value | |
INTN_MIN (conditionally present) |
minimum value of std::intN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INT_FASTN_MIN (conditionally present) |
minimum value of std::int_fastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INT_LEASTN_MIN (conditionally present) |
minimum value of std::int_leastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INTMAX_MIN |
minimum value of std::intmax_t (macro constant) |
INTPTR_MIN (conditionally present) |
minimum value of std::intptr_t (macro constant) |
Signed integers : maximum value | |
INTN_MAX (conditionally present) |
maximum value of std::intN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INT_FASTN_MAX (conditionally present) |
maximum value of std::int_fastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INT_LEASTN_MAX (conditionally present) |
maximum value of std::int_leastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
INTMAX_MAX |
maximum value of std::intmax_t (macro constant) |
INTPTR_MAX (conditionally present) |
maximum value of std::intptr_t (macro constant) |
Unsigned integers : bit width | |
UINTN_WIDTH (C++26)(conditionally present) |
bit width of std::uintN_t (N is typically 8, 16, 32 or 64) (macro constant) |
UINT_FASTN_WIDTH (C++26)(conditionally present) |
bit width of std::uint_fastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
UINT_LEASTN_WIDTH (C++26)(conditionally present) |
bit width of std::uint_leastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
UINTMAX_WIDTH (C++26) |
bit width of std::uintmax_t (macro constant) |
UINTPTR_WIDTH (C++26)(conditionally present) |
bit width of std::uintptr_t (macro constant) |
Unsigned integers : maximum value | |
UINTN_MAX (conditionally present) |
maximum value of std::uintN_t (N is typically 8, 16, 32 or 64) (macro constant) |
UINT_FASTN_MAX (conditionally present) |
maximum value of std::uint_fastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
UINT_LEASTN_MAX (conditionally present) |
maximum value of std::uint_leastN_t (N is typically 8, 16, 32 or 64) (macro constant) |
UINTMAX_MAX |
maximum value of std::uintmax_t (macro constant) |
UINTPTR_MAX (conditionally present) |
maximum value of std::uintptr_t (macro constant) |
Function macros
For each of the following macros marked (conditionally present), an implementation defines it if and only if the implementation defines the corresponding typedef name.
Defined in header
<cstdint> | |
INTN_C (conditionally present) |
expands to an integer constant expression of type std::int_leastN_t, its value is specified by the argument (function macro) |
INTMAX_C |
expands to an integer constant expression of type std::intmax_t, its value is specified by the argument (function macro) |
UINTN_C (conditionally present) |
expands to an integer constant expression of type std::uint_leastN_t, its value is specified by the argument (function macro) |
UINTMAX_C |
expands to an integer constant expression of type std::uintmax_t, its value is specified by the argument (function macro) |
#include <cstdint>
UINT64_C(0x123) // expands to a literal of type uint_least64_t and value 0x123
Format macro constants
Defined in header
<cinttypes> |
Format constants for the std::fprintf family of functions
Each of the PRI macros listed here is defined if and only if the implementation defines the corresponding typedef name.
| Equivalent for int orunsigned int
|
Description | Macros for data types | ||||
|---|---|---|---|---|---|---|
std::intx_t |
std::int_leastx_t |
std::int_fastx_t |
std::intmax_t |
std::intptr_t | ||
d
|
output of a signed decimal integer value | PRIdx | PRIdLEASTx | PRIdFASTx | PRIdMAX | PRIdPTR |
i
|
PRIix | PRIiLEASTx | PRIiFASTx | PRIiMAX | PRIiPTR | |
u
|
output of an unsigned decimal integer value | PRIux | PRIuLEASTx | PRIuFASTx | PRIuMAX | PRIuPTR |
o
|
output of an unsigned octal integer value | PRIox | PRIoLEASTx | PRIoFASTx | PRIoMAX | PRIoPTR |
x
|
output of an unsigned lowercase hexadecimal integer value | PRIxx | PRIxLEASTx | PRIxFASTx | PRIxMAX | PRIxPTR |
X
|
output of an unsigned uppercase hexadecimal integer value | PRIXx | PRIXLEASTx | PRIXFASTx | PRIXMAX | PRIXPTR |
Format constants for the std::fscanf family of functions
Each of the SCN macros listed in here is defined if and only if the implementation defines the corresponding typedef name and has a suitable std::fscanf length modifier for the type.
| Equivalent for int orunsigned int
|
Description | Macros for data types | ||||
|---|---|---|---|---|---|---|
std::intx_t |
std::int_leastx_t |
std::int_fastx_t |
std::intmax_t |
std::intptr_t | ||
d
|
input of a signed decimal integer value | SCNdx | SCNdLEASTx | SCNdFASTx | SCNdMAX | SCNdPTR |
i
|
input of a signed integer value | SCNix | SCNiLEASTx | SCNiFASTx | SCNiMAX | SCNiPTR |
u
|
input of an unsigned decimal integer value | SCNux | SCNuLEASTx | SCNuFASTx | SCNuMAX | SCNuPTR |
o
|
input of an unsigned octal integer value | SCNox | SCNoLEASTx | SCNoFASTx | SCNoMAX | SCNoPTR |
x
|
input of an unsigned hexadecimal integer value | SCNxx | SCNxLEASTx | SCNxFASTx | SCNxMAX | SCNxPTR |
Notes
Because C++ interprets a character immediately following a string literal as a user-defined string literal, C code such as printf("%"PRId64"\n",n); is invalid C++ and requires a space before PRId64.
The C99 standard suggests that C++ implementations should not define the above limit, constant, or format macros unless the macros __STDC_LIMIT_MACROS, __STDC_CONSTANT_MACROS or __STDC_FORMAT_MACROS (respectively) are defined before including the relevant C header (stdint.h or inttypes.h). This recommendation was not adopted by any C++ standard and was removed in C11. However, some implementations (such as glibc 2.17) try to apply this rule, and it may be necessary to define the __STDC macros; C++ compilers may try to work around this by automatically defining them in some circumstances.
std::int8_t may be signed char and std::uint8_t may be unsigned char, but neither can be char regardless of its signedness (because char is not considered a "signed integer type" or "unsigned integer type").
Example
See also a note regarding spaces before format macros used in this example.
#include <cinttypes>
#include <cstdio>
int main()
{
std::printf("%zu\n", sizeof(std::int64_t));
std::printf("%s\n", PRId64);
std::printf("%+" PRId64 "\n", INT64_MIN);
std::printf("%+" PRId64 "\n", INT64_MAX);
std::int64_t n = 7;
std::printf("%+" PRId64 "\n", n);
}
Possible output:
8
lld
-9223372036854775808
+9223372036854775807
+7
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2820 | C++11 | the requirements for optional typedef names and macros were inconsistent with C | made consistent |
References
- C++23 standard (ISO/IEC 14882:2024):
- 17.4.1 Header <cstdint> synopsis [cstdint.syn]
- 31.13.2 Header <cinttypes> synopsis [cinttypes.syn]
- C++20 standard (ISO/IEC 14882:2020):
- 17.4 Integer types [cstdint]
- 29.12.2 Header <cinttypes> synopsis [cinttypes.syn]
- C++17 standard (ISO/IEC 14882:2017):
- 21.4 Integer types [cstdint]
- 30.11.2 Header <cinttypes> synopsis [cinttypes.syn]
- C++14 standard (ISO/IEC 14882:2014):
- 18.4 Integer types [cstdint]
- 27.9.2 C library files [c.files]
- C++11 standard (ISO/IEC 14882:2011):
- 18.4 Integer types [cstdint]
- 27.9.2 C library files [c.files]
See also
C documentation for Fixed width integer types
|