Przestrzenie nazw
Warianty
Działania

Typy fundamentalne

Z cppreference.com
< cpp‎ | language

(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

signed char - typ reprezentujący znak, mogący przyjąć wartość ujemną.
unsigned char - 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ę lub wyrównanie pamięci co signed char lub unsigned char, 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 kodowania 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.
char16_t - typ stosowany przy reprezentacji UTF-16, powinien być wystarczająco duży, by mógł reprezentować dowolną jednostkę kodowania UTF-16 (16 bitów). Ma ten sam rozmiar, możliwość przechowywania wartości ujemnych, oraz wyrównanie jak std::uint_least16_t, ale jest osobnym typem.
char32_t - typ stosowany przy reprezentacji UTF-32, powinien być wystarczająco duży, by mógł reprezentować dowolną jednostkę kodowania UTF-32 (32 bitów). Ma ten sam rozmiar, możliwość przechowywania wartości ujemnych, oraz wyrównanie jak std::uint_least32_t, 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 jest użyty. Jeśli nie został użyty żaden modyfikator długości, przyjmie zagwarantowaną długość przynajmniej 16 bitów. Jednakże na 32/64-bitowych systemach jest to prawie zawsze zagwarantowane, że będzie miał przynajmniej 32 bity (zobacz poniżej).

[edytuj] Modyfikatory

Modyfikują całkowity typ. Mogą być użyte w dowolnej kolejności. Tylko jeden z każdej grupy może wystąpić w typie całościowym.

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.
long long - typ docelowy będzie miał długość przynajmniej 64 bitów.
(od C++11)

Notka: tak jak przy każdym specyfikatorze typu, dowolna kolejność jest dozwolona: unsigned long long int oraz long int unsigned long 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
short int przynajmniej
16
16 16 16 16
short int
signed short
signed short int
unsigned short
unsigned short int
unsigned short int
int
int przynajmniej
16
16 32 32 32
signed
signed int
unsigned
unsigned int
unsigned int
long
long int przynajmniej
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)
przynajmniej
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

Oprócz minimalnej ilości bitów, standard C++ gwarantuje, że:

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

Notka: to dozwala ekstremalną sytuację, w której bajty mają rozmiar 64 bitów, 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ą łacznie zwane modelem danych. Cztery modele danych zostały szeroko 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.
long double - 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órego 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)
  • min. pod-normalna: ± 1.401,298,4 · 10-45
  • min. normalna: ± 1.175,494,3 · 10-38
  • maks.: ± 3.402,823,4 · 1038
64 IEEE-754 ± 1.7 · 10± 308
(~15 cyfr)
  • min. pod-normalna: ± 4.940,656,458,412 · 10-324
  • min. normalna: ± 2.225,073,858,507,201,4 · 10-308
  • maks.: ± 1.797,693,134,862,315,7 · 10308


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ż

C documentation for typy arytmetyczne