Namespaces
Variants

Fundamental types

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

(См. также type для обзора системы типов и the list of type-related utilities предоставляемые библиотекой C++)

Следующие типы в совокупности называются фундаментальными типами :

  • (возможно, с cv-квалификаторами) void
(начиная с C++11)

Содержание

void

void — тип с пустым набором значений. Это неполный тип , который не может быть завершён (следовательно, объекты типа void запрещены). Не существует массивов из void , а также ссылок на void . Однако указатели на void и функции , возвращающие тип void ( процедуры в других языках) разрешены.

std::nullptr_t

Определено в заголовке <cstddef>
typedef decltype ( nullptr ) nullptr_t ;
(начиная с C++11)

std::nullptr_t - это тип литерала нулевого указателя nullptr . Это отдельный тип, который сам по себе не является типом указателя или типом указателя на член. Все его prvalues являются константами нулевого указателя .

sizeof ( std:: nullptr_t ) равен sizeof ( void * ) .

(начиная с C++11)

Целочисленные типы

Стандартные целочисленные типы

int — базовый целочисленный тип. Ключевое слово int может быть опущено, если используются любые из перечисленных ниже модификаторов. Если модификаторы длины отсутствуют, гарантируется ширина не менее 16 бит. Однако на 32/64-битных системах практически всегда гарантируется ширина не менее 32 бит (см. ниже).
Модификаторы

Изменяет базовый целочисленный тип. Может комбинироваться в любом порядке. Только один модификатор из каждой группы может присутствовать в имени типа.

  • Знаковость:
signed — целевой тип будет иметь знаковое представление (используется по умолчанию, если опущено)
unsigned — целевой тип будет иметь беззнаковое представление
  • Размер:
short — целевой тип будет оптимизирован по занимаемому пространству и будет иметь ширину не менее 16 бит.
long — целевой тип будет иметь ширину не менее 32 бит.

long long — целевой тип будет иметь ширину не менее 64 бит.
(начиная с C++11)

Примечание: как и со всеми спецификаторами типа, допустим любой порядок: unsigned long long int и long int unsigned long обозначают один и тот же тип.

Свойства

В следующей таблице приведены все доступные стандартные целочисленные типы и их свойства в различных распространенных моделях данных:

**Примечание:** В данном фрагменте HTML весь текст находится внутри тегов ` `, которые содержат C++ код. Согласно вашим инструкциям, текст внутри таких тегов (включая ключевые слова C++ как "unsigned char") не переводится, чтобы сохранить техническую точность и корректность кода. **Примечание:** В данном фрагменте HTML весь текст находится внутри тегов ` `, которые содержат исключительно C++ ключевые слова (`unsigned`, `short`, `int`). Согласно вашим инструкциям, C++ специфические термины и текст внутри тегов кода не подлежат переводу, поэтому весь контент оставлен без изменений. **Примечание:** В данном фрагменте HTML весь текст находится внутри тегов ` `, которые содержат C++ код. Согласно инструкциям: - Текст внутри тегов ` `, `
`, `` не переводится
- C++ специфические термины не переводятся
- HTML теги и атрибуты сохраняются без изменений
Поскольку весь текст представляет собой C++ ключевые слова (`unsigned`, `int`), перевод не требуется.
**Примечание:** Текст внутри тегов ` ` не был переведен, так как содержит C++ специфичные термины (`long int`), которые согласно требованиям должны сохраняться в оригинальном виде. HTML структура и форматирование полностью сохранены. **Примечание:** В данном фрагменте HTML все текстовые элементы уже являются C++ ключевыми словами (`unsigned`, `long`, `int`) и техническими обозначениями (`C++11`), которые согласно инструкциям не подлежат переводу. Поэтому перевод не требуется, исходный код остается без изменений. **Объяснение:** - HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` ` не переведен, так как это C++ код - Ключевые слова C++ (`unsigned`, `long`, `int`) сохранены в оригинале - Форматирование и структура HTML полностью сохранены
Спецификатор типа Эквивалентный тип Ширина в битах по модели данных
Стандарт C++ LP32 ILP32 LLP64 LP64
signed char
signed char как минимум
8
8 8 8 8
unsigned char
unsigned char
short
short int как минимум
16
16 16 16 16
short int
signed short
signed short int
unsigned short
unsigned short int
unsigned short int
int
int как минимум
16
16 32 32 32
signed
signed int
unsigned
unsigned int
unsigned int
long
long int как минимум
32
32 32 32 64
long int
signed long
signed long int
unsigned long
unsigned long int
unsigned long int
long long
long long int
(C++11)
как минимум
64
64 64 64 64
long long int
signed long long
signed long long int
unsigned long long
unsigned long long int
(C++11)
unsigned long long int

Примечание: целочисленная арифметика определяется по-разному для знаковых и беззнаковых целочисленных типов. См. арифметические операторы , в частности целочисленные переполнения .

std::size_t - это беззнаковый целочисленный тип результата оператора sizeof , а также оператора sizeof... и оператора alignof (начиная с C++11) .

Расширенные целочисленные типы

Расширенные целочисленные типы определяются реализацией. Обратите внимание, что типы целых чисел фиксированной ширины обычно являются псевдонимами стандартных целочисленных типов.

(since C++11)

Логический тип

bool — целочисленный тип, способный хранить одно из двух значений: true или false . Значение sizeof ( bool ) определяется реализацией и может отличаться от 1 .

Символьные типы

Символьные типы — это целочисленные типы, используемые для представления символов.

signed char — тип для представления знакового символа.
unsigned char — тип для представления беззнакового символа. Также используется для исследования представлений объектов (сырой памяти).
char — тип для представления символов, который может быть наиболее эффективно обработан на целевой системе (имеет то же представление и выравнивание, что и либо signed char , либо unsigned char , но всегда является отдельным типом). Строки многобайтовых символов используют этот тип для представления кодовых единиц. Для каждого значения типа unsigned char в диапазоне [ 0 , 255 ] , преобразование значения в char и затем обратно в unsigned char воспроизводит исходное значение. (начиная с C++11) Знаковость типа char зависит от компилятора и целевой платформы: по умолчанию для ARM и PowerPC обычно беззнаковый, для x86 и x64 — обычно знаковый.
wchar_t — тип для представления широких символов (см. широкие строки ). Имеет тот же размер, знаковость и выравнивание, что и один из целочисленных типов, но является отдельным типом. На практике он составляет 32 бита и содержит UTF-32 в Linux и многих других системах, отличных от Windows, но 16 бит и содержит кодовые единицы UTF-16 в Windows. Стандарт ранее требовал, чтобы wchar_t был достаточно большим для представления любой поддерживаемой кодовой точки символа. Однако это требование не может быть выполнено в Windows, и поэтому оно считается дефектом и было удалено.

char16_t — тип для представления символов UTF-16, должен быть достаточно большим для представления любой кодовой единицы UTF-16 (16 бит). Имеет тот же размер, знаковость и выравнивание, что и std::uint_least16_t , но является отдельным типом.

char32_t — тип для представления символов UTF-32, должен быть достаточно большим для представления любой кодовой единицы UTF-32 (32 бита). Имеет тот же размер, знаковость и выравнивание, что и std::uint_least32_t , но является отдельным типом.
(начиная с C++11)

char8_t — тип для представления символов UTF-8, должен быть достаточно большим для представления любой кодовой единицы UTF-8 (8 бит). Имеет тот же размер, знаковость и выравнивание, что и unsigned char (и, следовательно, тот же размер и выравнивание, что и char и signed char ), но является отдельным типом.
(начиная с C++20)

Помимо минимального количества битов, стандарт C++ гарантирует, что

1 == sizeof ( char ) sizeof ( short ) sizeof ( int ) sizeof ( long ) sizeof ( long long ) .

Примечание: это допускает крайний случай, когда байты имеют размер 64 бита, все типы (включая char ) имеют ширину 64 бита, и sizeof возвращает 1 для каждого типа.

Типы с плавающей запятой

Стандартные типы с плавающей точкой

Следующие три типа и их cv-квалифицированные версии в совокупности называются стандартными типами с плавающей запятой.

float — тип с плавающей точкой одинарной точности. Обычно используется формат IEEE-754 binary32 .
double — тип с плавающей точкой двойной точности. Обычно используется формат IEEE-754 binary64 .
long double — тип с плавающей точкой расширенной точности. Не обязательно соответствует типам, определённым стандартом IEEE-754.

Расширенные типы с плавающей запятой

Расширенные типы с плавающей запятой определяются реализацией. Они могут включать типы с плавающей запятой фиксированной ширины .

(начиная с C++23)

Свойства

Типы с плавающей запятой могут поддерживать специальные значения :

  • бесконечность (положительная и отрицательная), см. INFINITY
  • отрицательный ноль , - 0.0 . Он сравнивается как равный положительному нулю, но имеет значение в некоторых арифметических операциях, например 1.0 / 0.0 == INFINITY , но 1.0 / - 0.0 == - INFINITY ), и для некоторых математических функций, например sqrt (std::complex)
  • не-число (NaN), которое не сравнивается ни с чем (включая само себя). Несколько битовых шаблонов представляют NaN, см. std::nan , NAN . Обратите внимание, что C++ не делает специальных различий для сигнальных NaN, кроме обнаружения их поддержки с помощью std::numeric_limits::has_signaling_NaN , и рассматривает все NaN как тихие.

Числа с плавающей точкой могут использоваться с арифметическими операторами + , - , / , и * , а также с различными математическими функциями из <cmath> . Как встроенные операторы, так и библиотечные функции могут вызывать исключения с плавающей точкой и устанавливать errno , как описано в math errhandling .

Выражения с плавающей точкой могут иметь больший диапазон и точность, чем указано в их типах, см. FLT_EVAL_METHOD . Выражения с плавающей точкой также могут быть сконтрактированы , то есть вычисляться так, как если бы все промежуточные значения имели бесконечный диапазон и точность, см. #pragma STDC FP_CONTRACT . Стандарт C++ не ограничивает точность операций с плавающей точкой.

Некоторые операции над числами с плавающей запятой зависят от состояния окружения чисел с плавающей запятой и изменяют его (наиболее заметно - направление округления).

Неявные преобразования определены между типами с плавающей точкой и целочисленными типами.

См. limits of floating-point types и std::numeric_limits для дополнительной информации, ограничений и свойств типов с плавающей точкой.

Диапазон значений

В следующей таблице приведены справочные данные по ограничениям распространенных числовых представлений.

До C++20 стандарт C++ допускал любое представление знаковых целых чисел, и минимальный гарантированный диапазон N-битных знаковых целых чисел был от -(2 N-1
-1)
до +2 N-1
-1
(например, −127 до 127 для 8-битного знакового типа), что соответствует пределам обратного кода или прямого кода .

Однако все компиляторы C++ используют дополнительный код , и начиная с C++20 это единственное представление, разрешенное стандартом, с гарантированным диапазоном от -2 N-1
до +2 N-1
-1
(например, −128 до 127 для знакового 8-битного типа).

8-битные представления в дополнительном коде и со знаком и величиной для char были запрещены начиная с C++11 (посредством решения CWG issue 1759 ), поскольку кодовая единица UTF-8 со значением 0x80, используемая в строковом литерале UTF-8 должна быть сохраняема в объекте типа char .

Диапазон для типа с плавающей точкой T определяется следующим образом:

  • Минимальный гарантированный диапазон — это от самого отрицательного конечного числа с плавающей запятой, представимого в T , до самого положительного конечного числа с плавающей запятой, представимого в T .
  • Если отрицательная бесконечность представима в T , диапазон T расширяется до всех отрицательных действительных чисел.
  • Если положительная бесконечность представима в T , диапазон T расширяется до всех положительных действительных чисел.

Поскольку отрицательная и положительная бесконечность представимы в ISO/IEC/IEEE 60559 форматах, все вещественные числа лежат в пределах диапазона представимых значений типа с плавающей запятой, соответствующего стандарту ISO/IEC/IEEE 60559.

Тип Размер в битах Формат Диапазон значений
Приблизительный Точный
символьный 8 signed −128 до 127
unsigned 0 до 255
16 UTF-16 0 до 65535
32 UTF-32 0 до 1114111 ( 0x10ffff )
целочисленный 16 signed ± 3.27 · 10 4 −32768 до 32767
unsigned 0 до 6.55 · 10 4 0 до 65535
32 signed ± 2.14 · 10 9 −2,147,483,648 до 2,147,483,647
unsigned 0 до 4.29 · 10 9 0 до 4,294,967,295
64 signed ± 9.22 · 10 18 −9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
unsigned 0 до 1.84 · 10 19 0 до 18,446,744,073,709,551,615
двоичный
с плавающей
точкой
32 IEEE-754
  • минимальный субнормальный:
    ± 1.401,298,4 · 10 −45
  • минимальный нормальный:
    ± 1.175,494,3 · 10 −38
  • максимальный:
    ± 3.402,823,4 · 10 38
  • минимальный субнормальный:
    ±0x1p−149
  • минимальный нормальный:
    ±0x1p−126
  • максимальный:
    ±0x1.fffffep+127
64 IEEE-754
  • минимальный субнормальный:
    ± 4.940,656,458,412 · 10 −324
  • минимальный нормальный:
    ± 2.225,073,858,507,201,4 · 10 −308
  • максимальный:
    ± 1.797,693,134,862,315,7 · 10 308
  • минимальный субнормальный:
    ±0x1p−1074
  • минимальный нормальный:
    ±0x1p−1022
  • максимальный:
    ±0x1.fffffffffffffp+1023
80 [примечание 1] x86
  • минимальный субнормальный:
    ± 3.645,199,531,882,474,602,528
    · 10 −4951
  • минимальный нормальный:
    ± 3.362,103,143,112,093,506,263
    · 10 −4932
  • максимальный:
    ± 1.189,731,495,357,231,765,021
    · 10 4932
  • минимальный субнормальный:
    ±0x1p−16445
  • минимальный нормальный:
    ±0x1p−16382
  • максимальный:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • минимальный субнормальный:
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10 −4966
  • минимальный нормальный:
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10 −4932
  • максимальный:
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 10 4932
  • минимальный субнормальный:
    ±0x1p−16494
  • минимальный нормальный:
    ±0x1p−16382
  • максимальный:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. Представление объекта обычно занимает 96/128 бит на 32/64-битных платформах соответственно.

Примечание: фактические (в отличие от гарантированных минимальных) ограничения значений, представимых этими типами, доступны в интерфейсе числовых ограничений C и std::numeric_limits .

Модели данных

Выборы, сделанные каждой реализацией относительно размеров фундаментальных типов, в совокупности известны как модель данных . Четыре модели данных получили широкое распространение:

32-битные системы:

  • LP32 или 2/4/4 ( int — 16-битный, long и указатель — 32-битные)
  • Win16 API
  • ILP32 или 4/4/4 ( int , long и указатель — 32-битные);
  • Win32 API
  • Unix и Unix-подобные системы (Linux, macOS)

64-битные системы:

  • LLP64 или 4/4/8 ( int и long 32-битные, указатель 64-битный)
  • LP64 или 4/8/8 ( int 32-битный, long и указатель 64-битные)
  • Unix и Unix-подобные системы (Linux, macOS)

Другие модели встречаются очень редко. Например, ILP64 ( 8/8/8 : int , long , и указатель являются 64-битными) встречалась только в некоторых ранних 64-битных Unix-системах (например, UNICOS на Cray ).

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_unicode_characters 200704L (C++11) Новые символьные типы ( char16_t и char32_t )
__cpp_char8_t 201811L (C++20) char8_t
202207L (C++23) char8_t исправление совместимости и переносимости ( разрешение инициализации массивов (unsigned) char из строковых литералов UTF-8 )

Ключевые слова

void , bool , true , false , char , char8_t , char16_t , char32_t , wchar_t , int , short , long , signed , unsigned , float , double

Отчёты о дефектах

Следующие отчеты о дефектах, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
CWG 238 C++98 ограничения, накладываемые на реализацию чисел с плавающей точкой, не были указаны указано как
отсутствие ограничений
CWG 1759 C++11 char не гарантировал возможность представления UTF-8 кодовой единицы 0x80 гарантировано
CWG 2689 C++11 cv-квалифицированный std::nullptr_t не был фундаментальным типом является
CWG 2723 C++98 диапазоны представимых значений для типов с плавающей точкой не были указаны указаны
P2460R2 C++98 wchar_t требовалось, чтобы он мог представлять различные коды для всех элементов
наибольшего расширенного набора символов, указанного среди поддерживаемых локалей
не требуется

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 6.8.2 Фундаментальные типы [basic.fundamental]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 6.8.1 Фундаментальные типы [basic.fundamental]
  • Стандарт C++17 (ISO/IEC 14882:2017):
  • 6.9.1 Фундаментальные типы [basic.fundamental]
  • Стандарт C++14 (ISO/IEC 14882:2014):
  • 3.9.1 Фундаментальные типы [basic.fundamental]
  • Стандарт C++11 (ISO/IEC 14882:2011):
  • 3.9.1 Фундаментальные типы [basic.fundamental]
  • Стандарт C++03 (ISO/IEC 14882:2003):
  • 3.9.1 Фундаментальные типы [basic.fundamental]
  • Стандарт C++98 (ISO/IEC 14882:1998):
  • 3.9.1 Фундаментальные типы [basic.fundamental]

Смотрите также

C documentation для arithmetic types