Целочисленные типы с фиксированной шириной (с C++11)
Типы
Определено в заголовке <cstdint> |
|
|---|---|
| int8_tint16_tint32_tint64_t
(необязательно) | целочисленный тип со знаком с шириной ровно 8, 16, 32 и 64 бита соответственно без битов заполнения и использованием дополнительного кода для отрицательных значений (предоставляется только в том случае, если реализация напрямую поддерживает тип) (typedef) |
| int_fast8_tint_fast16_tint_fast32_tint_fast64_t | самый быстрый целочисленный тип со знаком с шириной не менее 8, 16, 32 и 64 битов соответственно (typedef) |
| int_least8_tint_least16_tint_least32_tint_least64_t | самый маленький целочисленный тип со знаком с шириной не менее 8, 16, 32 и 64 битов соответственно (typedef) |
| intmax_t | целочисленный тип со знаком максимальной ширины (typedef) |
| intptr_t
(необязательно) | целочисленный тип со знаком, способный хранить указатель на void (typedef) |
| uint8_tuint16_tuint32_tuint64_t
(необязательно) | целочисленный тип без знака с шириной ровно 8, 16, 32 и 64 бита соответственно (предоставляется только в том случае, если реализация напрямую поддерживает тип) (typedef) |
| uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t | самый быстрый целочисленный тип без знака с шириной не менее 8, 16, 32 и 64 битов соответственно (typedef) |
| uint_least8_tuint_least16_tuint_least32_tuint_least64_t | самый меньший целочисленный тип без знака с шириной не менее 8, 16, 32 и 64 битов соответственно (typedef) |
| uintmax_t | целочисленный тип без знака максимальной ширины (typedef) |
| uintptr_t
(необязательно) | целочисленный тип без знака, способный хранить указатель на void (typedef) |
Реализация может определить имена 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) // expands to a literal of type uint_least64_t and value 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 <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);
}Возможный вывод:
8 lld -9223372036854775808 +9223372036854775807 +7
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| 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 документация по Типы целых чисел с фиксированной шириной |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/integer