Основные типы
(См. также тип для обзора системы типов и список утилит, связанных с типами, предоставляемых библиотекой C++)
Тип void
void — тип с пустым набором значений. Это неполный тип, который не может быть дополнен (соответственно, объекты типа void запрещены). Нет массивов void, а также ссылок на void. Однако разрешены указатели на void и функции, возвращающие тип void (процедуры в других языках). std::nullptr_t (с C++11)
Определено в заголовке <cstddef> | ||
|---|---|---|
typedef decltype(nullptr) nullptr_t; | (с C++11) |
std::nullptr_t — это тип константы нулевого указателя nullptr. Это отдельный тип, который сам по себе не является типом указателя или указателя на член. Его значения — константы нулевого указателя (см. NULL), и они могут быть неявно преобразованы в любой тип указателя и указателя на член.
sizeof(std::nullptr_t) равно sizeof(void*).
Модели данных
Выбор каждой реализации относительно размеров основных типов в совокупности известен как модель данных. Широкое признание получили четыре модели данных:
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 бита)
- Win32 API (также называемый API Windows) с целевой компиляцией 64-битный ARM (AArch64) или x86-64 (также x64)
- LP64 или 4/8/8 (int — 32 бита, long и указатель — 64 бита)
- Системы Unix и Unix-подобные системы (Linux, macOS)
Другие модели встречаются очень редко. Например, ILP64 (8/8/8: int, long и указатель — 64 бита) встречалась только в некоторых ранних 64-битных системах Unix (например, UNICOS на Cray).
Целочисленные типы
Стандартные целочисленные типы
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 обозначают один и тот же тип.
Свойства
В следующей таблице обобщены все доступные целочисленные типы и их свойства в различных распространенных моделях данных:
| Спецификатор типа | Эквивалентный тип | Ширина в битах по модели данных | ||||
|---|---|---|---|---|---|---|
| Стандарт 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)
Расширенные целочисленные типы определяются реализацией. Обратите внимание, что типы целочисленных чисел фиксированной ширины обычно являются псевдонимами стандартных целочисленных типов.
Логический тип
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 для каждого типа.
Типы с плавающей запятой
Стандартные типы с плавающей запятой
Следующие три типа и их квалифицированные версии (с модификаторами const и volatile) вместе называются стандартными типами с плавающей запятой.
- float — тип с плавающей запятой одинарной точности. Соответствует формату IEEE-754 binary32, если он поддерживается.
- double — тип с плавающей запятой двойной точности. Соответствует формату IEEE-754 binary64, если он поддерживается.
-
long double — тип с плавающей запятой расширенной точности. Соответствует формату IEEE-754 binary128, если он поддерживается, в противном случае соответствует формату IEEE-754 binary64-extended, если он поддерживается, в противном случае соответствует некоторому формату расширенной плавающей запятой, который имеет большую точность, чем binary64, и не меньший диапазон, чем binary64, в противном случае соответствует формату IEEE-754 binary64.
- Формат binary128 используется некоторыми реализациями HP-UX, SPARC, MIPS, ARM64 и z/OS.
- Наиболее известный формат IEEE-754 binary64-extended — это формат расширенной точности x87 80 бит. Он используется во многих реализациях x86 и x86-64 (заметное исключение — MSVC, который реализует long double в том же формате, что и double, то есть binary64).
Типы с плавающей запятой расширенной точности (с 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++ не ограничивает точность операций с плавающей запятой.
Некоторые операции с числами с плавающей запятой зависят от и изменяют состояние среды с плавающей запятой (в частности, направление округления).
Неявные преобразования определены между вещественными типами с плавающей запятой и целочисленными типами.
См. Пределы типов с плавающей запятой и std::numeric_limits для получения дополнительной информации, пределов и свойств типов с плавающей запятой.
Диапазон значений
В следующей таблице представлен справочник по пределам распространённых числовых представлений.
До C++20 Стандарт C++ допускал любое знаковое целочисленное представление, и минимальный гарантированный диапазон N-битных знакомых целых чисел был от \(\scriptsize -(2^{N-1}-1)\)-(2N-1-1) до \(\scriptsize +2^{N-1}-1\)+2N-1-1 (например, −127 до 127 для знакового 8-битного типа), что соответствует пределам дополнительного кода или знакового и абсолютного значения.
Однако все компиляторы C++ используют дополнительный код, и начиная с C++20 он является единственным допустимым представлением по стандарту, с гарантированным диапазоном от \(\scriptsize -2^{N-1}\)-2N-1 до \(\scriptsize +2^{N-1}-1\)+2N-1-1 (например, −128 до 127 для знакового 8-битного типа).
8-битные представления дополнительного кода и знакового и абсолютного значения для char были запрещены с C++11 (через решение проблемы CWG 1759), потому что кодовая единица UTF-8 со значением 0x80, используемая в литерале UTF-8 строки, должна храниться в объекте типа char.
Диапазон для типа с плавающей запятой T определяется следующим образом:
- Минимальный гарантированный диапазон — это наименьшее конечное число с плавающей запятой, представимое в
Tчерез наибольшее конечное число с плавающей запятой, представимое вT. - Если в
Tможно представить отрицательную бесконечность, диапазонTрасширяется до всех отрицательных вещественных чисел. - Если в
Tможно представить положительную бесконечность, диапазонTрасширяется до всех положительных вещественных чисел.
Поскольку отрицательная и положительная бесконечность представимы в форматах ISO/IEC/IEEE 60559, все вещественные числа находятся в диапазоне представимых значений типа с плавающей запятой, соответствующего ISO/IEC/IEEE 60559.
END_OF_DOCUMENT_MARKER ```| Тип | Размер в битах | Формат | Диапазон значений | |
|---|---|---|---|---|
| Приблизительный | Точный | |||
| символ | 8 | знаковый | −128 до 127 | |
| беззнаковый | 0 до 255 | |||
| 16 | UTF-16 | 0 до 65535 | ||
| 32 | UTF-32 | 0 до 1114111 (0x10ffff) | ||
| целое | 16 | знаковый | ± 3,27 · 104 | −32768 до 32767 |
| беззнаковый | 0 до 6,55 · 104 | 0 до 65535 | ||
| 32 | знаковый | ± 2,14 · 109 | −2 147 483 648 до 2 147 483 647 | |
| беззнаковый | 0 до 4,29 · 109 | 0 до 4 294 967 295 | ||
| 64 | знаковый | ± 9,22 · 1018 | −9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 | |
| беззнаковый | 0 до 1,84 · 1019 | 0 до 18 446 744 073 709 551 615 | ||
| двоично-плавающая точка | 32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80[примечание 1] | x86 |
|
|
|
| 128 | IEEE-754 |
|
|
|
- Представление объекта обычно занимает 96/128 бит на 32/64-битных платформах соответственно.
Примечание: фактические (в отличие от гарантированных минимальных) ограничения на значения, представимые этими типами, доступны в C интерфейсе числовых ограничений и std::numeric_limits.
Примечания
| Макрокоманда проверки наличия функции | Значение | Стандарт | Функция |
|---|---|---|---|
__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, wchar_t, char8_t, (с C++20) char16_t, char32_t, (с C++11) int, short, long, signed, unsigned, float, double
Отчеты о дефектах
Следующие отчеты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| CWG 238 | C++98 | ограничения, накладываемые на реализацию с плавающей точкой, были не определены | определены как никаких ограничений |
| CWG 1759 | C++11 | char не гарантируется, что сможет представить код UTF-8 0x80 | гарантируется |
| CWG 2723 | C++98 | диапазоны представимых значений для типов с плавающей точкой не были указаны | указаны |
| P2460R2 | C++98 |
wchar_t должно было иметь возможность представить различные коды для всех членов наибольшего расширенного набора символов, указанного среди поддерживаемых локалей | не требуется |
См. также
- Обзор системы типов C++
- Спецификаторы const-volatility (cv) и квалификаторы
- Спецификаторы срока хранения
| C документация для арифметических типов |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/types