Пространства имён
Варианты
Действия

Целочисленные типы фиксированной ширины (начиная с C++11)

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 

Содержание

[править] Типы

Определены в заголовочном файле <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 по Целочисленные типы фиксированной ширины