Целочисленные типы фиксированной ширины (начиная с 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::int x_t |
std::int_least x_t |
std::int_fast x_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::int x_t |
std::int_least x_t |
std::int_fast x_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 по Целочисленные типы фиксированной ширины
|