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

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.
char16_t - typ stosowany do reprezentacji UTF-16, powinien być wystarczająco duży, by óc 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 do 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 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.
longlong - typ docelowy będzie miał długość przynajmniej 64 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
16161616
shortint
signedshort
signedshortint
unsignedshort
unsignedshortint
unsignedshortint
int
int przynajmniej
16
16323232
signed
signedint
unsigned
unsignedint
unsignedint
long
longint przynajmniej
32
32323264
longint
signedlong
signedlongint
unsignedlong
unsignedlongint
unsignedlongint
longlong
longlongint
(C++11)
przynajmniej
64
64646464
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 · 1040 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 · 1090 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 · 10190 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
close