Целочисленные типы фиксированной ширины (начиная с C++11)
Типы
Определены в заголовочном файле
<cstdint> | |
int8_tint16_tint32_tint64_t (необязательно) |
целочисленный тип со знаком шириной ровно 8, 16, 32 и 64 бита соответственно без битов заполнения и с использованием дополнения до 2 для отрицательных значений (при условии и только если реализация напрямую поддерживает тип) (определение типа) |
int_fast8_tint_fast16_tint_fast32_tint_fast64_t |
самый быстрый целочисленный тип со знаком шириной не менее 8, 16, 32 и 64 бит соответственно (определение типа) |
int_least8_tint_least16_tint_least32_tint_least64_t |
наименьший целочисленный тип со знаком шириной не менее 8, 16, 32 и 64 бит соответственно (определение типа) |
intmax_t |
целочисленный тип со знаком максимальной ширины (определение типа) |
intptr_t (необязательно) |
целочисленный тип со знаком, способный содержать указатель на void (определение типа) |
uint8_tuint16_tuint32_tuint64_t (необязательно) |
целочисленный тип без знака шириной ровно 8, 16, 32 и 64 бита соответственно (при условии и только если реализация напрямую поддерживает этот тип) (определение типа) |
uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t |
самый быстрый целочисленный тип без знака с шириной не менее 8, 16, 32 и 64 бит соответственно (определение типа) |
uint_least8_tuint_least16_tuint_least32_tuint_least64_t |
наименьший целочисленный тип без знака шириной не менее 8, 16, 32 и 64 бит соответственно (определение типа) |
uintmax_t |
беззнаковый целочисленный тип максимальной ширины (определение типа) |
uintptr_t (необязательно) |
целочисленный тип без знака, способный содержать указатель на void (определение типа) |
Реализация может определять typedef имена intN_t, int_fastN_t, int_leastN_t, uintN_t, uint_fastN_t и uint_leastN_t где N равно 8, 16, 32 или 64. typedef имена вида intN_t могут быть определены только в том случае, если реализация поддерживает целочисленный тип такой ширины без заполнения. Таким образом, std::uint24_t обозначает целочисленный тип без знака шириной ровно 24 бита.
Каждый из перечисленных ниже макросов определён тогда и только тогда, когда реализация определяет соответствующее typedef имя. Макросы INTN_C и UINTN_C соответствуют typedef именам int_leastN_t и uint_leastN_t соответственно.
Макроконстанты
Определены в заголовочном файле
<cstdint> | |
Целые числа со знаком: минимальное значение | |
INT8_MININT16_MININT32_MININT64_MIN (необязательно) |
минимальное значение std::int8_t, std::int16_t, std::int32_t и std::int64_t соответственно (макроконстанта) |
INT_FAST8_MININT_FAST16_MININT_FAST32_MININT_FAST64_MIN |
минимальное значение std::int_fast8_t, std::int_fast16_t, std::int_fast32_t и std::int_fast64_t соответственно (макроконстанта) |
INT_LEAST8_MININT_LEAST16_MININT_LEAST32_MININT_LEAST64_MIN |
минимальное значение std::int_least8_t, std::int_least16_t, std::int_least32_t и std::int_least64_t соответственно (макроконстанта) |
INTPTR_MIN (необязательно) |
минимальное значение std::intptr_t (макроконстанта) |
INTMAX_MIN |
минимальное значение std::intmax_t (макроконстанта) |
Целые числа со знаком: максимальное значение | |
INT8_MAXINT16_MAXINT32_MAXINT64_MAX (необязательно) |
максимальное значение std::int8_t, std::int16_t, std::int32_t и std::int64_t соответственно (макроконстанта) |
INT_FAST8_MAXINT_FAST16_MAXINT_FAST32_MAXINT_FAST64_MAX |
максимальное значение std::int_fast8_t, std::int_fast16_t, std::int_fast32_t и std::int_fast64_t соответственно (макроконстанта) |
INT_LEAST8_MAXINT_LEAST16_MAXINT_LEAST32_MAXINT_LEAST64_MAX |
максимальное значение std::int_least8_t, std::int_least16_t, std::int_least32_t и std::int_least64_t соответственно (макроконстанта) |
INTPTR_MAX (необязательно) |
максимальное значение std::intptr_t (макроконстанта) |
INTMAX_MAX |
максимальное значение std::intmax_t (макроконстанта) |
Целые числа без знака: максимальное значение | |
UINT8_MAXUINT16_MAXUINT32_MAXUINT64_MAX (необязательно) |
максимальное значение std::uint8_t, std::uint16_t, std::uint32_t и std::uint64_t соответственно (макроконстанта) |
UINT_FAST8_MAXUINT_FAST16_MAXUINT_FAST32_MAXUINT_FAST64_MAX |
максимальное значение std::uint_fast8_t, std::uint_fast16_t, std::uint_fast32_t и std::uint_fast64_t соответственно (макроконстанта) |
UINT_LEAST8_MAXUINT_LEAST16_MAXUINT_LEAST32_MAXUINT_LEAST64_MAX |
максимальное значение std::uint_least8_t, std::uint_least16_t, std::uint_least32_t и std::uint_least64_t соответственно (макроконстанта) |
UINTPTR_MAX (необязательно) |
максимальное значение std::uintptr_t (макроконстанта) |
UINTMAX_MAX |
максимальное значение std::uintmax_t (макроконстанта) |
Макросы функций для целочисленных констант минимальной ширины
INT8_CINT16_CINT32_CINT64_C |
расширяется до целочисленного константного выражения, имеющего значение, указанное его аргументом, и тип которого является расширенным типом std::int_least8_t, std::int_least16_t, std::int_least32_t и std::int_least64_t соответственно (функция-макрос) |
INTMAX_C |
расширяется до целочисленного константного выражения, имеющего значение, указанное его аргументом, и тип std::intmax_t (функция-макрос) |
UINT8_CUINT16_CUINT32_CUINT64_C |
расширяется до целочисленного константного выражения, имеющего значение, указанное его аргументом, и тип которого является расширенным типом std::uint_least8_t, std::uint_least16_t, std::uint_least32_t и std::uint_least64_t соответственно (функция-макрос) |
UINTMAX_C |
расширяется до целочисленного константного выражения, имеющего значение, указанное его аргументом, и тип std::uintmax_t (функция-макрос) |
#include <cstdint>
UINT64_C(0x123) // расширяется до литерала типа uint_least64_t и значения 0x123
Макроконстанты формата
Определены в заголовочном файле
<cinttypes> |
Константы формата для семейства функций std::fprintf
Каждый из перечисленных здесь макросов PRI определён тогда и только тогда, когда реализация определяет соответствующее typedef имя.
| Эквивалент для int илиunsigned int
|
Описание | Макросы для типов данных | ||||
|---|---|---|---|---|---|---|
std::intx_t |
std::int_leastx_t |
std::int_fastx_t |
std::intmax_t |
std::intptr_t | ||
d
|
вывод десятичного целого числа со знаком | PRIdx | PRIdLEASTx | PRIdFASTx | PRIdMAX | PRIdPTR |
i
|
PRIix | PRIiLEASTx | PRIiFASTx | PRIiMAX | PRIiPTR | |
u
|
вывод беззнакового десятичного целого числа | PRIux | PRIuLEASTx | PRIuFASTx | PRIuMAX | PRIuPTR |
o
|
вывод беззнакового восьмеричного целого числа | PRIox | PRIoLEASTx | PRIoFASTx | PRIoMAX | PRIoPTR |
x
|
вывод беззнакового шестнадцатеричного целого числа в нижнем регистре | PRIxx | PRIxLEASTx | PRIxFASTx | PRIxMAX | PRIxPTR |
X
|
вывод беззнакового шестнадцатеричного целого числа в верхнем регистре | PRIXx | PRIXLEASTx | PRIXFASTx | PRIXMAX | PRIXPTR |
Константы формата для семейства функций std::fscanf
Каждый из перечисленных здесь макросов SCN определён тогда и только тогда, когда реализация определяет соответствующее typedef имя и имеет подходящий модификатор длины std::fscanf для типа.
| Эквивалент для int илиunsigned int
|
Описание | Макросы для типов данных | ||||
|---|---|---|---|---|---|---|
std::intx_t |
std::int_leastx_t |
std::int_fastx_t |
std::intmax_t |
std::intptr_t | ||
d
|
ввод десятичного целого числа со знаком | SCNdx | SCNdLEASTx | SCNdFASTx | SCNdMAX | SCNdPTR |
i
|
ввод целочисленного значения со знаком | SCNix | SCNiLEASTx | SCNiFASTx | SCNiMAX | SCNiPTR |
u
|
ввод беззнакового десятичного целого числа | SCNux | SCNuLEASTx | SCNuFASTx | SCNuMAX | SCNuPTR |
o
|
ввод беззнакового восьмеричного целого числа | SCNox | SCNoLEASTx | SCNoFASTx | SCNoMAX | SCNoPTR |
x
|
ввод беззнакового шестнадцатеричного целого числа | SCNxx | SCNxLEASTx | SCNxFASTx | SCNxMAX | SCNxPTR |
Примечание
Поскольку C++ интерпретирует символ, следующий непосредственно за строковым литералом, как определяемый пользователем строковый литерал, код C, такой как printf("%"PRId64"\n",n);, является недопустимым в C++ и требует пробела перед PRId64.
Стандарт C99 предполагает, что реализации C++ не должны определять вышеуказанные макросы лимита, констант или формата, если не определены макросы __STDC_LIMIT_MACROS, __STDC_CONSTANT_MACROS или __STDC_FORMAT_MACROS (соответственно) перед включением соответствующего заголовка C (stdint.h или inttypes.h). Эта рекомендация не была принята ни одним стандартом C++ и была удалена в версии C11. Однако некоторые реализации (например, glibc 2.17) пытаются применить это правило, и может оказаться необходимым определить макросы __STDC; Компиляторы C++ могут попытаться обойти это, автоматически определив их в некоторых обстоятельствах.
std::int8_t может быть signed char и std::uint8_t может быть unsigned char, но ни один из них не может быть char независимо от его знака (поскольку char не считается "целочисленным типом со знаком" или "целочисленным типом без знака").
Пример
Смотрите также примечание относительно пробелов перед макросами форматирования, используемых в этом примере.
#include <cstdio>
#include <cinttypes>
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);
}
Возможный вывод:
8
lld
-9223372036854775808
+9223372036854775807
+7
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2820 | C++11 | требования к необязательным typedef именам и макросам были несовместимы с C | сделаны совместимыми |
Ссылки
- C++23 стандарт (ISO/IEC 14882:2023):
- 17.4 Целочисленные типы [cstdint]
- 31.13.2 Резюме заголовка <cinttypes> [cinttypes.syn]
- C++20 стандарт (ISO/IEC 14882:2020):
- 17.4 Целочисленные типы [cstdint]
- 29.12.2 Резюме заголовка <cinttypes> [cinttypes.syn]
- C++17 стандарт (ISO/IEC 14882:2017):
- 21.4 Целочисленные типы [cstdint]
- 30.11.2 Резюме заголовка <cinttypes> [cinttypes.syn]
- C++14 стандарт (ISO/IEC 14882:2014):
- 18.4 Целочисленные типы [cstdint]
- 27.9.2 Файлы библиотеки C [c.files]
- C++11 стандарт (ISO/IEC 14882:2011):
- 18.4 Целочисленные типы [cstdint]
- 27.9.2 Файлы библиотеки C [c.files]
Смотрите также
Документация C по Целочисленные типы фиксированной ширины
|