Typy fundamentalne
(Zobacz też typ dla zbioru informacji o systemie typów oraz listę typów oraz powiązanych narzędzi, które są dostarczane przez bibliotekę C++)
Spis treści |
[edytuj]Typ void
- void - typ z pustym zbiorem możliwych wartości. Jest to niepełny typ, który nie może być skompletowany (w związku z czym, obiekty typu void nie są dozwolone). Nie istnieją tablice elementów typu void, ani referencje na void. Jednakże wskaźniki na void i funkcje zwracające void (procedury w innych językach) są dozwolone.
[edytuj]std::nullptr_t
Zdefiniowane w nagłówku <cstddef> | ||
typedef decltype(nullptr) nullptr_t; | (od C++11) | |
std::nullptr_t jest typem literału wartości pustego wskaźnika, nullptr. Jest to oddzielny typ, który sam w sobie nie jest typem wskaźnika, ani typem wskaźnika na pole klasy.
[edytuj]Typ boolowski
- bool - typ, mogący przechowywać jedną z dwóch wartości: true (prawdę) lub false (fałsz). Wartość wyrażenia sizeof(bool) jest zależna od implementacji i może się różnić od 1.
[edytuj]Typy znaków
- signedchar - typ reprezentujący znak, mogący przyjmować wartość ujemną.
- unsignedchar - typ reprezentujący znak, mogący przyjąć tylko wartość nieujemną. Jest również używany do sprawdzania reprezentacji obiektu (surowej pamięci, znajdującej się pod danym adresem).
- char - typ reprezentacji znaku, który może być przetwarzany z największą wydajnością na docelowym systemie (ma tą samą reprezentację i wyrównanie pamięci co signedchar lub unsignedchar, ale jest zawsze oddzielnym typem). Wielobajtowe ciągi znaków używają tego typu, do reprezentacji jednostki kodu. Typy znakowe są wystarczająco duże, by móc reprezentować dowolną jednostkę kodowania UTF-8.(od C++14). Możliwość przechowywania wartości ujemnych przez char zależy od kompilatora oraz od platformy docelowej: domyślnie dla ARM oraz PowerPC są zwykle bez znaku, dla x86 i x64 są zwykle ze znakiem.
- wchar_t - typ, stosowany do reprezentacji szerokiego znaku (zobacz ciągi szerokich znaków). Wymaganym jest, by mógł reprezentować dowolne ze wspieranych kodowań (32 bity na systemach wspierających Unicode. Zauważalnym wyjątkiem jest Windows, na którym wchar_t ma 16 bitów i zawiera kodowanie UTF-16). Ma ten sam rozmiar, możliwość przechowywania wartości ujemnych, oraz wyrównanie jak jeden z typów całkowitych, ale jest osobnym typem.
| (od C++11) |
[edytuj]Typy całkowite
- int - bazowy typ dla liczb całkowitych. Słowo kluczowe int może być pominięte jeśli którykolwiek z wymienionych poniżej modyfikatorów został użyty. Jeśli nie został użyty żaden modyfikator długości, przyjmowana jest długość przynajmniej 16 bitów. Jednakże na 32/64-bitowych systemach operacyjnych jest to prawie zawsze pewne, że będzie miał przynajmniej 32 bity (zobacz poniżej).
[edytuj]Modyfikatory
Modyfikują typ całkowity. Mogą być użyte w dowolnej kolejności. Tylko jeden typ z każdej grupy może zostać użyty.
Możliwość przechowywania wartości ze znakiem
- signed - typ docelowy będzie posiadał możliwość przechowywania wartości ujemnych - tzw. reprezentacja ze znakiem (domyślne, jeśli zostało pominięte)
- unsigned - typ docelowy nie będzie mógł przyjmować wartości ujemnych - reprezentacja bez znaku.
Rozmiar
- short - typ docelowy będzie zoptymalizowany pod względem wielkości i będzie miał długość przynajmniej 16 bitów.
- long - typ docelowy będzie miał długość przynajmniej 32 bitów.
| (od C++11) |
Notka: tak jak przy każdym specyfikatorze typu, kolejność modyfikatorów jest dowolna: unsignedlonglongint oraz longintunsignedlong są tym samym typem.
[edytuj]Właściwości
Następująca tabela zawiera wszystkie dostępne typy całkowite oraz ich właściwości:
Specyfikator typu | Ekwiwalent | Szerokość w bitach z modelu danych | ||||
---|---|---|---|---|---|---|
Standard C++ | LP32 | ILP32 | LLP64 | LP64 | ||
short | shortint | przynajmniej 16 | 16 | 16 | 16 | 16 |
shortint | ||||||
signedshort | ||||||
signedshortint | ||||||
unsignedshort | unsignedshortint | |||||
unsignedshortint | ||||||
int | int | przynajmniej 16 | 16 | 32 | 32 | 32 |
signed | ||||||
signedint | ||||||
unsigned | unsignedint | |||||
unsignedint | ||||||
long | longint | przynajmniej 32 | 32 | 32 | 32 | 64 |
longint | ||||||
signedlong | ||||||
signedlongint | ||||||
unsignedlong | unsignedlongint | |||||
unsignedlongint | ||||||
longlong | longlongint (C++11) | przynajmniej 64 | 64 | 64 | 64 | 64 |
longlongint | ||||||
signedlonglong | ||||||
signedlonglongint | ||||||
unsignedlonglong | unsignedlonglongint (C++11) | |||||
unsignedlonglongint |
Oprócz minimalnej ilości bitów, standard C++ gwarantuje, że:
- 1== sizeof(char)<= sizeof(short)<= sizeof(int)<= sizeof(long)<= sizeof(longlong).
Notka: Istnieje ekstremalna sytuacja, w której bajty mają rozmiar 64 bitów, wtedy wszystkie typy (włącznie z char) mają 64 bity, oraz sizeof zwraca 1 dla każdego typu.
Notka: arytmetyka na liczbach całkowitych jest zdefiniowana osobno dla typów ze znakiem oraz bez znaku. Zobacz operatory arytmetyczne, zwłaszcza przepełnienia liczb całkowitych.
[edytuj]Model danych
Wybrane właściwości przez daną implementację odnoszące się do rozmiaru typów fundamentalnych są zwane modelem danych. Cztery modele danych zostały zaakceptowane:
32 bitowe systemy:
- LP32 lub 2/4/4 (int ma 16 bitów, long oraz wskaźnik mają 32 bity)
- Win16 API
- ILP32 or 4/4/4 (int, long, oraz wskaźnik mają 32 bity);
- Win32 API
- Unix oraz systemy Unixopodobne (Linux, Mac OS X)
64 bitowe systemy:
- LLP64 or 4/4/8 (int oraz long mają 32-bity a wskaźnik jest 64 bitowy)
- Win64 API
- LP64 or 4/8/8 (int ma 32 bity, long oraz wskaźnik mają 64 bity)
- Unix oraz systemy Unixopodobne (Linux, Mac OS X)
Inne modele są spotykane bardzo rzadko. Na przykład, ILP64 (8/8/8: int, long, oraz wskaźnik 64 bitowe) pojawił się tylko we wczesnych 64-bitowych systemach Unix (np. Unicos na Cray).
[edytuj]Typy zmiennoprzecinkowe
- float - typ zmiennoprzecinkowy pojedynczej precyzji. Zwykle oparty na standardzie IEEE-754 32 bit.
- double - typ zmiennoprzecinkowy podwójnej precyzji. Zwykle oparty na standardzie IEEE-754 64 bit.
- longdouble - typ zmiennoprzecinkowy o rozszerzonej precyzji. Nie musi koniecznie kierować się typami nałożonymi przez IEEE-754. Zwykle 80-bitowy x87 zmiennoprzecinkowy typ na architekturach x86 oraz x86-64.
[edytuj]Właściwości
Typy zmiennoprzecinkowe mogą wspierać specjalne wartości:
- nieskończoność (dodatnia oraz ujemna), zobacz INFINITY
- ujemne zero, -0.0. Jest porównywalna z dodatnim zerem, jednak ma specjalne znaczenie przy niektórych operacjach arytmetycznych, np. 1.0/0.0==INFINITY, ale 1.0/-0.0==-INFINITY), oraz przy niektórych funkcjach matematycznych, np. sqrt(std::complex)
- nie-liczba (NaN, not-a-number), której nie można porównać do żadnej wartości (włącznie z samym NaN). Wielobitowe wzorce reprezentują wartość NaN, zobacz std::nan, NAN. Pamiętaj, że C++ nie daje żadnej specjalnej informacji o wywoływaniu sygnału przy NaN-ach, oprócz możliwości sprawdzenia, czy są wspierane przy użyciu std::numeric_limits::has_signaling_NaN, oraz traktuje każdy NaN jako wyciszony.
Liczby zmiennoprzecinkowe moga być użyte z operatorami arytmetycznymi + - / * oraz różnymi funkcjami matematycznymi z cmath. Wbudowane operatory, tak samo jak funkcje z biblioteki mogą rzucić wyjątki liczb zmiennoprzecinkowych oraz ustawić errno w sposób opisany w math_errhandling
Wyrażenia zmiennoprzecinkowe mogą mieć większy zakres oraz precyzję, niż wskazywałby na to ich typ, zobacz FLT_EVAL_METHOD. Wyrażenia zmiennoprzecinkowe mogą także być rozwinięte, co oznacza, obliczone jakby wszystkie pośrednie wartości miały nieskończony zakres oraz precyzję, zobacz #pragma STDC FP_CONTRACT.
Niektóre operacje na liczbach zmiennoprzecinkowych podlegają wpływom stanu środowiska liczb zmiennoprzecinkowych (najbardziej zauważalnie, przy kierunku zaokrąglania).
Niejawne konwersje są zdefiniowane pomiędzy zmiennoprzecinkowymi typami rzeczywistymi oraz typami całkowitymi.
Zobacz Limity typów zmiennoprzecinkowych oraz std::numeric_limits po dodatkowe informacje, limity, oraz właściwości typów zmiennoprzecinkowych.
[edytuj]Zakresy wartości
Następująca tabela przedstawia wartości referencyjne limitów popularnych reprezentacji typów numerycznych. Standard C++ pozwala na dowolną reprezentację liczb całkowitych, więc w tabeli znajdziemy obydwa - minimalne zagwarantowane wymagania (które odpowiadają limitom z kodu uzupełnień do jedności lub sposobu Kod znak-moduł) oraz limitom najczęściej używanej implementacji, kodu uzupełnień do dwóch. Wszystkie popularne modele danych (włączając wszystkie ILP32, LP32, LP64, LLP64) używają kodu uzupełnień do dwóch.
Typ | Rozmiar w bitach | Format | Zakres wartości | |
---|---|---|---|---|
Przybliżona | Dokładna | |||
znak | 8 | signed (uzupeł. do jedności) | -127 do 127 | |
signed (uzupeł. do dwóch) | -128 do 127 | |||
unsigned | 0 do 255 | |||
16 | unsigned | 0 do 65535 | ||
32 | unsigned | 0 do 1114111 (0x10ffff) | ||
całkowite | 16 | signed (uzupeł. do jedności) | ± 3.27 · 104 | -32767 do 32767 |
signed (uzupeł. do dwóch) | -32768 do 32767 | |||
unsigned | 0 do 6.55 · 104 | 0 do 65535 | ||
32 | signed (uzupeł. do jedności) | ± 2.14 · 109 | -2,147,483,647 do 2,147,483,647 | |
signed (uzupeł. do dwóch) | -2,147,483,648 do 2,147,483,647 | |||
unsigned | 0 do 4.29 · 109 | 0 do 4,294,967,295 | ||
64 | signed (uzupeł. do jedności) | ± 9.22 · 1018 | -9,223,372,036,854,775,807 do 9,223,372,036,854,775,807 | |
signed (uzupeł. do dwóch) | -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 | |||
unsigned | 0 do 1.84 · 1019 | 0 do 18,446,744,073,709,551,615 | ||
zmienno- przecinkowe | 32 | IEEE-754 | ± 3.4 · 10± 38 (~7 cyfr) |
|
64 | IEEE-754 | ± 1.7 · 10± 308 (~15 cyfr) |
|
Notka: faktyczne (w przeciwieństwie do zagwarantowanych minimalnych) limity wartości reprezentowanych przez te typy są dostępne w <climits>, <cfloat> oraz std::numeric_limits
[edytuj]Słowa kluczowe
void, bool, true, false, char, wchar_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double
[edytuj]Zobacz też
- Przegląd systemu typów C++
- specyfikatory cv - const-volatility (stały-ulotny)
- specyfikatory czasu przechowywania
C documentation for typy arytmetyczne |