miniatura|Ierarhia standard de tipuri din Python 3 În informatică și programarea calculatoarelor, un tip de date (sau doar tip) este o colecție sau o grupare de , de regulă specificate printr-un set de valori posibile, un set de operațiuni permise asupra acelor valori, și/sau o reprezentare a acestor valori ca tipuri mașină. Specificarea unui tip de date într-un program constrânge valorile posibile pe care le poate lua o , cum ar fi o variabilă sau un apel de funcție. Pe datele literale, el spune compilatorului sau interpretorului cum intenționează programatorul să folosească datele. Cele mai multe limbaje de programare suportă ca tipuri de date de bază numerele (de diferite dimensiuni), numere în virgulă mobilă (care aproximează numerele reale), caracterele și booleenii.

Concept Există mai multe motive pentru care s-ar dori specificarea unui tip de date: similitudine, convenabilitate, sau dorința de a atrage atenția. Frecvent, este o chestiune de bună organizare, care ajută la înțelegerea definițiilor complexe. Aproape toate limbajele de programare includ explicit noțiunea de tip de date, deși tipurile posibile sunt adesea restricționate din considerente de simplitate, calculabilitate, sau regularitate. Declararea explicită a unui tip de date permite de regulă compilatorului să aleagă o reprezentare mașină eficientă, dar joacă un rol și organizarea conceptuală oferită de tipurile de date.

Diferite limbaje pot folosi tipuri date cu semantici diferite. De exemplu, în limbajul Python, int reprezintă un pe care se pot efectua operații numerice tradiționale, ca adunare, scădere și înmulțire. În limbajul Java, în schimb tipul int reprezintă mulțimea numerelor pe 32 de biți cu valori de la până la , cu operațiuni aritmetice care ciclează la . În Rust, acest tip de întregi pe 32 de biți se notează cu i32 și dă eroare la overflow în modul debug.

Cele mai multe limbaje de programare permit programatorului și să definească tipuri adiționale, de regulă prin combinarea mai multor elemente de alte tipuri și prin definirea operațiunilor valide asupra noului tip de date. De exemplu, un programator ar putea crea un tip numit „număr complex” care ar include partea reală și cea imaginară; sau un tip de date „culoare” care să reprezinte cei trei octeți care reprezintă cantitățile de roșu, verde și albastru, precum și, eventual, o reprezentare ca șir de caractere al numelui culorii.

Tipurile de date se folosesc în cadrul , care oferă diferite moduri de definire, implementare și utilizare a lor. Într-un sistem de tipuri, un tip de date reprezintă o constrângere aplicată interpretării datelor, descrierii reprezentării, interpretării și structurii sau obiectelor stocate în memoria calculatorului. Sistemul de tipuri utilizează informația despre tipul de date pentru a verifica care accesează sau manipulează datele. Un compilator ar putea folosi tipul static al unei valori pentru a optimiza spațiul de stocare necesar sau pentru a alege algoritmii care operează asupra valorii. În multe compilatoare de C, tipul de date , de exemplu, este reprezentat pe 32 de biți, în conformitate cu specificația IEEE pentru numere în virgulă mobilă cu precizie simplă. Astfel, pe aceste valori, ele vor folosi specifice reprezentării în virgulă mobilă (adunare, înmulțire în virgulă mobilă etc.).

au identificat cinci definiții ale unui „tip” care au fost folosite—uneori implicit—în literatura de specialitate:

Sintactică Un tip este o etichetă pur sintactică asociată cu o la declararea ei. Deși este utilă pentru sistemele avansate de tipuri, cum ar fi , asemenea definiții nu le dau niciun sens intuitiv. Reprezentare Un tip este definit în termeni de compunere a mai multor tipuri primitive—adesea, tipuri mașină. Reprezentare și comportament Un tip este definit prin reprezentarea sa și printr-un set de ce manipulează acele reprezentări. Spațiul valorilor Un tip este o mulțime de valori posibile pe care le poate lua o variabilă. Prin asemenea definiții se poate vorbi despre reuniuni () sau produse carteziene ale tipurilor. Spațiul valorilor și comportament Un tip este un set de valori pe care le poate lua o variabilă, și un set de care se poat aplica pe aceste valori.

Definiția în termeni de reprezentare se face adesea în limbaje imperative, ca ALGOL și Pascal, în timp ce definiția în termeni de spațiu al valorilor și comportament este folosită în limbaje de nivel mai înalt, ca Simula și . Tipurile care cuprind și comportamentul se aliniază mai îndeaproape cu modelele orientate pe obiecte, în vreme ce un model pentru programarea structurată ar tinde să nu includă cod, asemenea modele fiind denumite .

Clasificare Tipurile de date pot fi categorisite după mai mulți factori:

sunt cele incluse într-o implementare a limbajului. Tipurile definite de utilizator nu sunt primitive. De exemplu, tipurile numerice din Java sunt primitive, dar clasele sunt definite de utilizator. O valoare a unui tip atomic este un element unic de date care nu poate fi descompus în părți componente. O valoare a unui sau agregat este o colecție de elemente de date ce pot fi accesate individual. De exemplu, un întreg este în general considerat atomic, deși constă dintr-un șir de biți, dar un tablou de numere întregi este cu certitudine compozit. Tipurile de date de bază sau fundamentale sunt definite axiomatic din noțiuni fundamentale, sau prin enumerarea elementelor lor. Tipurile de date derivate sunt specificate, și în parte definite, în termeni de alte tipuri de date. Toate tipurile de bază sunt atomice. De exemplu, întregii sunt un tip de bază definit în matematică, dar un tablou de întregi este rezultatul aplicării unui generator de tip tablou asupra tipului întreg.

Terminologia variază în literatură, denumirile de tip primitiv, de bază, atomic și fundamental pot fi folosite pentru aceeași noțiune.

Exemple

Tipuri de date mașină La cel mai scăzut nivel, toate datele din calculatoarele bazate pe electronică digitală sunt reprezentate ca biți (ce pot avea valori de 0 și 1). Cea mai mică unitate de date adresabilă este numită byte (de regulă un octet, adică 8 biți). Unitatea prelucrată de instrucțiunile de cod mașină se numește (în 2026, aceasta însemna de regulă 64 de biți).

Tipurile de date mașină expun (sau pun la dispoziție) un control fin asupra hardware-ului, dar și detalii de implementare care pot face codul să fie mai puțin portabil. Astfel, tipurile mașină sunt folosite mai ales în sau în . În limbajele de nivel mai înalt, cele mai multe tipuri de date sunt abstractizate prin aceea că nu au o reprezentare mașină definită de limbaj. Limbajul C, de exemplu, furnizează tipuri ca booleeni, întregi, numere în virgulă mobilă etc., dar reprezentările exacte pe biți ale acestor tipuri sunt definite de implementare. Singurul tip C cu o reprezentare mașină exactă este tipul char ce reprezintă un octet.

Tipul boolean Tipul boolean reprezintă valorile și . Deși sunt posibile doar două valori, ele sunt cel mai adesea reprezentate pe un octet sau un cuvânt, și nu pe un singur bit, întrucât este nevoie de mai multe operații mașină pentru a stoca și adresa un bit individual. Multe limbaje de programare nu au un tip boolean explicit, folosind în schimb un tip întreg în care interpretează valoarea (de exemplu) 0 ca fals și celelalte valori ca adevărat. Datele booleene se referă la structura logică a felului cum se interpretează lumbajul în cod mașină. În acest caz, un 0 boolean reprezintă un fals logic. Adevărul este întotdeauna diferit de zero, adică un 1 boolean.

Aproape toate limbajele de programare furnizează unul sau mai multe tipuri de date . Ele pot furniza fie un număr mic de subtipuri predefinite restricționate la anumite intervale (cum ar fi short și long cu variantele lor unsigned corespunzătoare în C/C++); sau pot permite utilizatorilor să definească în mod liber subintervale ca 1..12 (de ex., Pascal/Ada). Dacă nu există un tip nativ corespunzător pe platforma de rulare, compilatorul le va descompune în cod folosind tipuri care există. De exemplu, dacă un număr întreg pe 32 de biți este cerut de un program compilat pe o platformă pe 16 biți, compilatorul îl va trata tacit ca un tablou de doi întregi pe 16 biți.

Datele în virgulă mobilă reprezintă anumite valori fracționare (din punct de vedere matematic, numere raționale). Deși au limite predefinite asupra valorilor maxime și asupra preciziei lor, ele sunt adesea denumite în mod eronat „numere reale” (care evocă numerele reale din matematică). Intern, ele sunt de regulă stocate sub forma (cu și întregi, denumiți mantisă și exponent), dar se afișează și în formă zecimală.

Datele în virgulă fixă sunt convenabile pentru valori monetare. Ele sunt adesea stocate intern ca numere întregi, cu limitele predefinite.

Pentru independența de detaliile arhitecturii, se pot furniza și tipuri de date Bignum sau de . Acestea reprezintă un număr întreg sau rațional la o precizie limitată doar de memoria disponibilă și de resursele computaționale ale sistemului. Implementările operațiilor aritmetice pe asemenea tipuri de date sunt semnificativ mai lente decât operațiile mașină corespunzătoare.

Enumerările au valori distincte, care pot fi comparate și atribuite, dar care nu au neapărat vreo reprezentare concretă în memoria calculatorului; compilatoarele și interpretoarele le pot reprezenta arbitrar. De exemplu, cele patru culori ale cărților de joc pot fi patru enumeratori numiți TREFLĂ, CARO, CUPĂ, PICĂ, aparținând unui tip enumerat CuloareCărți. Dacă se declară o valoare V de acest tip, ei i se pot atribui oricare din aceste patru valori. Unele implementări le permit programatorilor să atribuie valori numerice valorilor enumerate, sau chiar să le trateze ca tipuri echivalente cu întregii.

Tipurile text sau șir de caractere sunt o secvență de caractere folosite pentru a stoca cuvinte sau text simplu, cel mai adesea limbaje de markup textuale ce reprezintă text formatat. Caracterele pot fi litere din vreun alfabet, cifre, spații, semne de punctuație etc. Caracterele sunt extrase dintr-un set de caractere cum ar fi ASCII sau Unicode. Caracterele și alte tipuri similare pot avea subtipuri diferite conform codificării caracterelor. Setul originar ASCII pe 7 biți și-a atins rapid limitele, și a fost înlocuit cu seturi de caractere pe 8, 16 și 32 de biți, care pot codifica o varietate mare de alfabete nelatine (cum ar fi cel ebraic și cel chinezesc) și alte simboluri. Șirurile de caractere pot fi de lungime fixă sau variabilă, iar unele limbaje le suportă pe ambele.

Întrucât cele mai multe seturi de caractere cuprind și cifrele, poate fi reprezentat și un șir numeric, cum ar fi "1234". Aceste șiruri numerice sunt de regulă considerate distincte de valorile numerice ca 1234, dar unele limbaje convertesc automat între ele. Ca exemplu, limbajul ECMAScript are operatori diferiți de comparație care dau rezultate diferite când se compară valoarea numerică cu cea textuală a unui număr.

Tipurile reuniune Definiția unui tip reuniune specifică ce subtipuri dintr-un număr de subtipuri permise pot fi stocate în instanțele sale, de exemplu „virgulă mobilă sau întreg lung”. Spre deosebire de , care poate fi definit ca a conține un număr în virgulă mobilă și un întreg, reuniunea poate conține doar un subtip.

O (denumit variant, înregistrare varianță, reuniune discriminată, sau reuniune disjunctă) conține încă un câmp care indică tipul actual pentru siguranța operațiunilor.

Tipuri de date algebrice