Целочисленные типы фиксированной ширины (начиная с 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 или unsignedint | Описание | Макросы для типов данных | ||||
---|---|---|---|---|---|---|
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 или unsignedint | Описание | Макросы для типов данных | ||||
---|---|---|---|---|---|---|
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
может быть signedchar и std::uint8_t
может быть unsignedchar, но ни один из них не может быть 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 по Целочисленные типы фиксированной ширины |