Primitivní datový typ - Primitive data type

V informatice je primitivní datový typ buď následující:

  • základní typ je datový typ poskytována programovacího jazyka jako základní stavební kámen. Většina jazyků umožňuje rekurzivně konstruovat složitější složené typy počínaje základními typy.
  • vestavěný typ je datový typ, pro který poskytuje programovací jazyk vestavěnou podporu.

Ve většině programovacích jazyků jsou integrovány všechny základní datové typy. Mnoho jazyků navíc poskytuje sadu složených datových typů.

V závislosti na jazyce a jeho implementaci mohou, ale nemusí mít primitivní datové typy individuální korespondenci s objekty v paměti počítače. Člověk však obvykle očekává, že operace na základních primitivních datových typech budou nejrychlejšími jazykovými konstrukty, jaké existují. Sčítání celých čísel lze například provádět jako jedinou strojovou instrukci a některé procesory nabízejí specifické instrukce pro zpracování sekvencí znaků pomocí jediné instrukce. Zejména standard C uvádí, že „obyčejný“ int objekt má přirozenou velikost navrhovanou architekturou prostředí pro provádění. “ To znamená, že intje pravděpodobné, že bude mít 32 bitů na 32bitové architektuře. Základní primitivní typy jsou téměř vždy hodnotové typy .

Většina jazyků neumožňuje, aby programy nebo upravovaly chování nebo schopnosti primitivních (buď vestavěných nebo základních) datových typů. Mezi výjimky patří Smalltalk , který umožňuje rozšíření všech datových typů v rámci programu, přidání operací, které na nich lze provádět, nebo dokonce předefinování vestavěných operací.

Přehled

Skutečný rozsah primitivních datových typů, který je k dispozici, závisí na konkrétním používaném programovacím jazyce. Například v jazyce C # , struny jsou kompozitní, ale vestavěný datový typ, zatímco v moderních dialektech BASIC a JavaScriptu , které se považují za primitivní datový typ, který je základní i vestavěný.

Klasické základní primitivní typy mohou zahrnovat:

Výše uvedená primitiva jsou obecně podporována víceméně přímo počítačovým hardwarem, s výjimkou případu s plovoucí desetinnou čárkou, takže operace s takovými primitivy jsou obvykle poměrně účinné. Některé programovací jazyky podporují textové řetězce jako primitivní (např. BASIC), zatímco jiné považují textový řetězec za řadu znaků (např. C). Některý počítačový hardware (např. X86) obsahuje pokyny, které pomáhají při práci s textovými řetězci, ale úplná hardwarová podpora pro textové řetězce je vzácná.

Řetězcem může být libovolná řada znaků v použitém kódování . K oddělení řetězců od kódu je většina jazyků uzavírá jednoduchými nebo dvojitými uvozovkami. Například „Hello World“ nebo „Hello World“. Všimněte si, že „200“ by mohlo být zaměněno za celočíselný typ, ale ve skutečnosti je to typ řetězce, protože je obsažen v uvozovkách.

Mezi sofistikovanější typy, které lze integrovat, patří:

Specifické primitivní datové typy

Celočíselná čísla

Číslo typ dat představuje určitý rozsah matematických celých čísel . Celá čísla mohou být buď se znaménkem (umožňující záporné hodnoty), nebo bez znaménka ( pouze nezáporná celá čísla ). Společné rozsahy jsou:

Velikost ( bajty ) Velikost ( bity ) Jména Podepsaný rozsah (za předpokladu, že se doplní dvěma pro podepsané ) Rozsah bez znaménka
1 bajt 8 bitů Byte , oktet , minimální velikost charv C99 (viz limits.h CHAR_BIT) −128 až +127 0 až 255
2 bajty 16 bitů slovo x86 , minimální velikost shorta intv C −32 768 až +32 767 0 až 65 535
4 byty 32 bitů dvojité slovo x86, minimální velikost longv C, skutečná velikost intpro většinu moderních kompilátorů C, ukazatel pro procesory kompatibilní s IA -32 −2,147,483,648 až +2,147,483,647 0 až 4 294 967 295
8 bajtů 64 bitů čtyřnásobné slovo x86, minimální velikost long longv C, skutečná velikost longpro většinu moderních kompilátorů C, ukazatel pro procesory kompatibilní s x86-64 −9,223,372,036,854,775,808 až +9,223,372,036,854,775,807 0 až 18 446 744 073 709 551 615
neomezeně/8 neomezený Bignum –2 neomezené /2 až +(2 neomezené / 2–1 ) 0 až 2 neomezeně - 1

Literály pro celá čísla lze zapsat jako běžné arabské číslice , skládající se ze sekvence číslic a s negací označenou znaménkem minus před hodnotou. Většina programovacích jazyků však pro seskupování číslic zakazuje použití čárek nebo mezer . Příklady celočíselných literálů jsou:

  • 42
  • 10 000
  • -233 000

Existuje několik alternativních metod pro psaní celočíselných literálů v mnoha programovacích jazycích:

  • Většina programovacích jazyků, zejména těch, které jsou ovlivněny C , má předponu celého čísla doslova 0X nebo 0x, aby představovala hexadecimální hodnotu, např. 0xDEADBEEF . Jiné jazyky mohou používat jiný zápis, např. Některé montážní jazyky připojují H nebo h na konec hexadecimální hodnoty.
  • Perl , Ruby , Java , Julia , D , Rust a Python (od verze 3.6) umožňují vložená podtržítka pro přehlednost, např. 10_000_000 , a Fortran v pevné formě ignoruje vložené mezery v celočíselných literálech.
  • V C a C ++ počáteční nula označuje osmičkovou hodnotu, např. 0755 . Toto bylo primárně zamýšleno pro použití s Unixovými režimy ; byla však kritizována, protože normální celá čísla mohou také vést s nulou. Jako takový, Python , Ruby , Haskell a OCaml předpona osmičkové hodnot s 0 ° a 0o , po rozložení používá hexadecimální hodnoty.
  • Několik jazyků, včetně Java , C# , Scala , Python , Ruby a OCaml , může představovat binární hodnoty předponou čísla s 0B nebo 0b .

Čísla s plovoucí desetinnou čárkou

Plovoucí desetinnou čárkou číslo představuje omezenou přesností racionální číslo , které může mít desetinnou část. Tato čísla jsou interně uložena ve formátu ekvivalentním vědeckému zápisu , obvykle v binárním, ale někdy v desítkovém formátu . Protože čísla s plovoucí desetinnou čárkou mají omezenou přesnost, lze přesně reprezentovat pouze podmnožinu reálných nebo racionálních čísel; ostatní čísla lze znázornit pouze přibližně.

Mnoho jazyků má jak jednoduchou přesnost (často nazývanou „float“), tak typ s dvojitou přesností .

Literály pro čísla s plovoucí desetinnou čárkou obsahují desetinnou čárku a obvykle používají e nebo E k označení vědecké notace. Příklady literálů s plovoucí desetinnou čárkou jsou:

  • 20 0005
  • 99,9
  • -5000,12
  • 6.02e23

Některé jazyky (např. Fortran , Python , D ) mají také komplexní číselný typ obsahující dvě čísla s plovoucí desetinnou čárkou: skutečnou část a imaginární část.

Čísla s pevným bodem

Pevným bodem číslo představuje omezenou přesností racionální číslo , které může mít desetinnou část. Tato čísla jsou interně uložena ve škálovaném celočíselném tvaru, obvykle v binárním, ale někdy i desetinném čísle . Protože čísla s pevným bodem mají omezenou přesnost, lze přesně reprezentovat pouze podmnožinu reálných nebo racionálních čísel; ostatní čísla lze znázornit pouze přibližně. Čísla s pevnou desetinnou čárkou také mívají omezenější rozsah hodnot než plovoucí desetinná čárka , a proto si musí programátor dávat pozor, aby se vyhnul přetečení v mezilehlých výpočtech i konečnému výsledku.

Booleovci

Logická typu, obvykle označený jako „bool“ nebo „logická hodnota“, je obvykle logický typ , který může mít buď hodnotu „true“ nebo hodnota „falešný“. Ačkoli je k přizpůsobení sady hodnot „true“ a „false“ nutný pouze jeden bit, programovací jazyky obvykle implementují logické typy jako jeden nebo více bajtů.

Mnoho jazyků (např. Java , Pascal a Ada ) implementuje boolean dodržující koncept boolean jako zřetelný logický typ. Jazyky však mohou občas implicitně převádět logické hodnoty na číselné typy, aby poskytovaly rozšířenou sémantiku booleovským a logickým výrazům nebo aby dosáhly zpětné kompatibility s dřívějšími verzemi jazyka. Například rané verze programovacího jazyka C, které následovaly ANSI C a jeho dřívější standardy, neměly vyhrazený booleovský typ. Místo toho jsou číselné hodnoty nula interpretovány jako „nepravda“ a jakákoli jiná hodnota je interpretována jako „pravda“. Novější C99 přidal odlišný booleovský typ, který lze zahrnout do stdbool.h , a C ++ podporuje booljako předdefinovaný typ a „true“ a „false“ jako vyhrazená slova.

Znaky a řetězce

Znak typ (obvykle nazývá „char“), může obsahovat jediný dopis , číslice , interpunkční znaménko , symbol , formátování kódu, kontrolní kód nebo jiný speciální kód (např značka pořadí bajtů ). V C , charje definována jako nejmenší adresovatelná jednotka paměti. U většiny systémů je to 8 bitů ; Několik standardů, jako je POSIX , vyžaduje, aby byla tato velikost. Některé jazyky mají dva nebo více typů znaků, například jednobajtový typ pro znaky ASCII a vícebajtový typ pro znaky Unicode . Pojem „znakový typ“ se běžně používá i pro typy, jejichž hodnoty přesněji reprezentují kódové jednotky , například kódová jednotka UTF-16 jako v Javě (podpora omezena pouze na 16bitové znaky) a JavaScript .

Znaky lze kombinovat do řetězců . Řetězcová data mohou obsahovat čísla a další číselné symboly, ale jsou považována za text. Například matematické operace, které lze provádět s číselnou hodnotou (např. 200), obecně nelze provádět se stejnou hodnotou zapsanou jako řetězec (např. „200“).

Řetězce jsou implementovány různými způsoby, v závislosti na programovacím jazyce. Nejjednodušší způsob, jak implementovat řetězce, je vytvořit je jako pole znaků, za kterým následuje oddělovací znak používaný k signalizaci konce řetězce, obvykle NUL . Ty jsou označovány jako řetězce s nulovou koncovkou a obvykle se nacházejí v jazycích s malým množstvím hardwarové abstrakce , jako je C a Assembly . I když se snadno implementují, řetězce s nulovým zakončením byly kritizovány za způsobení přetečení vyrovnávací paměti . Většina skriptovacích jazyků na vysoké úrovni, jako je Python , Ruby a mnoho dialektů BASIC , nemá žádný samostatný znakový typ; řetězce představující délku jednoho se obvykle používají k reprezentaci jednotlivých znaků. Některé jazyky, jako je C ++ a Javu , mají možnost použít null ukončených řetězců (většinou pro opatření zpětně kompatibilita), ale navíc poskytují své vlastní třídu pro manipulaci s řetězci ( std::stringa java.lang.String, v uvedeném pořadí) ve standardní knihovně.

Existuje také rozdíl v tom, zda jsou řetězce v jazyce mutovatelné nebo neměnné . Mutovatelné řetězce lze po jejich vytvoření změnit, zatímco neměnné řetězce udržují konstantní velikost a obsah. V druhém případě je jediným způsobem, jak změnit řetězce, vytvořit nové. Každý přístup má své výhody i nevýhody: ačkoli neměnné řetězce jsou mnohem méně flexibilní, jsou jednodušší a zcela bezpečné pro vlákna . Některé příklady jazyků, které používají měnitelné řetězce, zahrnují C ++ , Perl a Ruby , zatímco jazyky, které neobsahují JavaScript , Lua , Python a Go . Několik jazyků, jako například Objective-C , poskytuje různé typy pro měnitelné a neměnné řetězce.

Literály pro znaky a řetězce jsou obvykle obklopeny uvozovkami : někdy jsou pro znaky použity jednoduché uvozovky ( ' ) a pro řetězce dvojité uvozovky ( " ). Python přijímá pro řetězcový zápis obě varianty.

Příklady znakových literálů v syntaxi C jsou:

Příklady řetězcových literálů v syntaxi C jsou:

  • "A"
  • "Ahoj světe"
  • „Jsou tam 4 kočky.“

Rozsahy číselných datových typů

Každý numerický datový typ má svou maximální a minimální hodnotu známou jako rozsah . Pokus o uložení čísla mimo rozsah může vést k chybám kompilátoru/modulu runtime nebo k nesprávným výpočtům (kvůli zkrácení ) v závislosti na používaném jazyce.

Rozsah proměnné je založen na počtu bajtů použitých k uložení hodnoty a celočíselný datový typ je obvykle schopen uložit 2 n hodnot (kde n je počet bitů, které přispívají k hodnotě). U ostatních datových typů (např. Hodnoty s plovoucí desetinnou čárkou ) je rozsah složitější a bude se lišit v závislosti na metodě použité k jeho uložení. Existuje také několik typů, které nepoužívají celé bajty, např. Logická hodnota, která vyžaduje jeden bit , a představuje binární hodnotu (ačkoli v praxi se často používá bajt, přičemž zbývajících 7 bitů je nadbytečných). Některé programovací jazyky (například Ada a Pascal ) umožňují i ​​opačný směr, to znamená, že programátor definuje rozsah a přesnost potřebnou k vyřešení daného problému a kompilátor automaticky vybere nejvhodnější celočíselný nebo plovoucí desetinnou čárku.

Viz také

Reference

externí odkazy