Fundamental types
(См. также type для обзора системы типов и the list of type-related utilities предоставляемые библиотекой C++)
Следующие типы в совокупности называются фундаментальными типами :
- (возможно, с cv-квалификаторами) void
|
(начиная с C++11) |
Содержание |
void
- void — тип с пустым набором значений. Это неполный тип , который не может быть завершён (следовательно, объекты типа void запрещены). Не существует массивов из void , а также ссылок на void . Однако указатели на void и функции , возвращающие тип void ( процедуры в других языках) разрешены.
|
std::nullptr_t
std::nullptr_t
- это тип литерала нулевого указателя
sizeof ( std:: nullptr_t ) равен sizeof ( void * ) . |
(начиная с C++11) |
Целочисленные типы
Стандартные целочисленные типы
- 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 | ||
|
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, и поэтому оно считается дефектом и было удалено.
|
|
(начиная с 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.
- Формат IEEE-754 binary128 используется в некоторых реализациях HP-UX, SPARC, MIPS, ARM64 и z/OS.
- Наиболее известный расширенный формат IEEE-754 binary64 — 80-битный формат расширенной точности x87 . Он используется во многих реализациях x86 и x86-64 (заметным исключением является MSVC, который реализует long double в том же формате, что и double , т.е. binary64).
- На PowerPC может использоваться double-double .
Расширенные типы с плавающей запятойРасширенные типы с плавающей запятой определяются реализацией. Они могут включать типы с плавающей запятой фиксированной ширины . |
(начиная с 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 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80 [примечание 1] | x86 |
|
|
|
| 128 | IEEE-754 |
|
|
|
- ↑ Представление объекта обычно занимает 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-битный)
-
- Win32 API (также называемый Windows API) с целью компиляции 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 ).
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__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++
- Спецификаторы и квалификаторы const-volatility (cv)
- Спецификаторы продолжительности хранения
|
C documentation
для
arithmetic types
|