Фундаментальные типы
(Смотрите также тип для обзора системы типов и список утилит, связанных с типами, которые предоставляются библиотекой C++)
Содержание |
[править] Тип void
- void - тип с пустым набором значений. Это неполный тип, который не может быть завершён (следовательно, объекты типа
voidзапрещены). Нет ни массивов типаvoid, ни ссылок наvoid. Однако, указатели наvoidи возвращаемый типvoidфункции (процедуры на других языках ) разрешены.
[править] std::nullptr_t
| Определено в заголовочном файле <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-битный)
- Win64 API
- 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 бит.
|
|
(начиная с C++11) |
Примечание: как и для всех спецификаторов типов, разрешён любой порядок: unsigned long long int и long int unsigned long именуют один и тот же тип.
[править] Свойства
В следующей таблице приведены все доступные целочисленные типы и их свойства в различных общих моделях данных:
| Спецификатор типа | Эквивалентный тип | Ширина в битах согласно модели данных | ||||
|---|---|---|---|---|---|---|
| Стандарт C++ | LP32 | ILP32 | LLP64 | LP64 | ||
| 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).
|
Смотрите также Целочисленные типы с фиксированной шириной. |
(начиная с 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, но в Windows 16-битный и содержит кодовые единицы UTF-16. Стандарт требует, чтобы wchar_t был достаточно большим, чтобы представлять любую поддерживаемую кодовую точку символа. Однако такое требование невозможно выполнить в Windows, поэтому оно считается дефектом и устранено в P2460R2.
|
|
(начиная с C++11) |
|
|
(начиная с 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 binary128, если поддерживается, в противном случае соответствует IEEE-754 binary64-расширенному формату, если поддерживается, иначе соответствует некоторому расширенному формату с плавающей запятой, отличному от IEEE-754, если его точность лучше, чем binary64, и диапазон не менее хорош как binary64, иначе соответствует формату IEEE-754 binary64.
- Формат binary128 используется некоторыми реализациями HP-UX, SPARC, MIPS, ARM64 и z/OS.
- Самый известный IEEE-754 binary64-расширенный формат это 80-битный x87 формат с расширенной точностью. Он используется многими реализациями x86 и x86-64 (заметным исключением является MSVC, который реализует long double в том же формате, что и double, то есть binary64).
[править] Свойства
Типы с плавающей запятой могут поддерживать специальные значения:
- бесконечность (положительная и отрицательная), смотрите INFINITY
- отрицательный ноль, -0.0. Его сравнение эквивалентно положительному нулю, но имеет смысл в некоторых арифметических операциях, например 1.0/0.0 == INFINITY, но 1.0/-0.0 == -INFINITY), а также для некоторых математических функций, например sqrt(std::complex)
- не число (NaN - not-a-number), которое не сравнивается ни с чем (включая себя). Множество битовых шаблонов представляют значения NaN, смотрите std::nan, NAN. Обратите внимание, что C++ не обращает особого внимания на сигнализацию NaN, кроме определения его поддержки с помощью std::numeric_limits::has_signaling_NaN, и обрабатывает все NaN скрыто.
Действительные числа с плавающей запятой могут использоваться с арифметическими операторами + - / * и различными математическими функциями из cmath. И встроенные операторы, и библиотечные функции могут вызывать исключения с плавающей запятой и устанавливать errno, как описано в math_errhandling
Выражения с плавающей запятой могут иметь больший диапазон и точность, чем указано их типами, смотрите FLT_EVAL_METHOD. Выражения с плавающей запятой также могут быть сжатыми, то есть вычисляться, как если бы все промежуточные значения имели бесконечный диапазон и точность, смотрите #pragma STDC FP_CONTRACT.
На некоторые операции с числами с плавающей запятой влияет (и модифицирует состояние) среда с плавающей запятой (в первую очередь, направление округления).
Определено неявное преобразование между реальными плавающими типами и целочисленными типами.
Смотрите Ограничения типов с плавающей запятой и std::numeric_limits для получения дополнительных сведений, ограничений и свойств типов с плавающей запятой.
[править] Диапазон значений
В следующей таблице приведены ограничения для обычных числовых представлений.
До C++20 стандарт C++ допускал любое представление целых чисел со знаком, а минимальный гарантированный диапазон N-битных целых чисел со знаком был от -(2N-1
-1) до +2N-1
-1 (например -127 и 127 для 8-битного типа со знаком), что соответствует ограничениям дополнение до единиц или знак и величина.
Однако все компиляторы C++ используют представление дополнение до двух, и, начиная с C++20, это единственное представление, разрешённое стандартом, с гарантированным диапазоном от -2N-1
до +2N-1
-1 (например -128 и 127 для 8-битного типа со знаком).
8-битные представления дополнения до единицы, знака и величины для char были запрещены с C++11 (через CWG 1759), поскольку кодовая единица UTF-8 со значением 0x80, используемая в строковом литерале UTF-8, должна храниться в объекте элемента char.
| Тип | Размер в битах | Формат | Диапазон значений | |
|---|---|---|---|---|
| Приблизительный | Точный | |||
| символ | 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
[править] Ключевые слова
void, bool, true, false, char, wchar_t, char8_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| CWG 1759 | c++11 | не гарантируется, что char сможет представлять кодовую единицу UTF-8 0x80 | гарантируется |
[править] Смотрите также
- обзор системы типов C++
- спецификаторы и квалификаторы const-volatility (cv)
- спецификаторы длительности хранения
| Документация по C для арифметические типы
|

