Datatyp

Från Wikipedia
Version från den 15 juli 2017 kl. 15.11 av InternetArchiveBot (Diskussion | Bidrag) (Räddar 1 källor och märker 0 som döda. #IABot (v1.4.1))

I programspråk är en datatyp ett attribut för data som berättar för datorn (och programmeraren) vilken sorts information datat bär på. Eftersom all information i datorn, även text och bilder, internt hanteras som tal är datatyper ett sätt att se skillnad på vad talen representerar.

I många programspråk bestämmer programmeraren vilken datatyp som ska kunna lagras i en variabel. Försöker man lagra värden av en annan typ kan fel uppstå. Vissa fel kan upptäckas automatiskt redan när koden skrivs eller kompileras, medan andra fel kan få programmet att krascha eller ge oväntade resultat när man kör programmet eftersom programmet tror att datat är något annat än vad det egentligen är. Jämför med vad som kan hända ifall någon lagrar gift i ett mjölkpaket.

Hur och när datatypen för en variabel bestäms är något som skiljer mycket mellan olika programmeringsspråk. Det är därför vanligt att man klassificerar språk efter deras typsystem.

Datatyper

Primitiva datatyper

Primitiva datatyper är sådana som programmeringsspråket tillhandahåller direkt. Det är enkla typer som man i princip inte kan klara sig utan, till exempel heltal, flyttal och boolska värden. De primitiva datatyperna kan i många språk kombineras till mer komplexa typer, som då inte längre är primitiva.

Abstrakta typer

En abstrakt datatyp är inom datorprogrammering en datatyp som förutom att definiera själva datats art (datatypen) även definierar de operationer som är tillåtna på detta data. Man säger att en abstrakt datatyp kapslar in[förtydliga] såväl datat som operationer på detta data.

En abstrakt datatyp kan sägas vara en teoretisk beskrivning av en klass i ett objektorienterat programmeringsspråk. Implementation av abstrakta datatyper förutsätter dock inte att det programmeringsspråk man väljer har stöd för objektkonstruktioner - det går bra att skapa abstrakta datatyper i såväl funktionella som imperativa programmeringsspråk så länge dessa är strukturerade och ger stöd för funktionsanrop och godtyckliga definitioner av datastrukturer.

En väldefinierad abstrakt datatyp kännetecknas bland annat av att den har ett gränssnitt (ett API) som tillåter en användare att använda denna utan att behöva göra några antaganden om hur den underliggande implementationen är utförd.

Ett exempel på en abstrakt datatyp kan till exempel vara en Lista. En lista består av element (dvs. listans rader), och möjligheten att lägga till element och att stryka bort dem. API:et för en abstrakt datatyp Lista kan således vara

  • Create (Skapa)
  • Add (Lägg till element)
  • Get (Hämta ett visst element från listan)
  • Remove (Ta bort/stryk över element)
  • Destroy (Riv sönder/Kasta bort listan)

Själva datatypen är alltså Lista, och de definierade operationerna är Create, Add, Get, Remove och Destroy.

Pekare och referenstyper

Se även: Muspekare

Pekare är en datatyp som refererar till en annan datatyp på en annan plats i minnet på en dator. En sträng (char*, i C) är egentligen en pekare till den första minnesadressen i strängen. Exempelvis finns strängen "Hello World" i minnet och hänvisas till av en pekare, så pekar pekaren på den första adressen - vilket är den plats där 'H' finns lagrat i minnet på datorn.

Informell beskrivning

I en dator lagras och hanteras data på olika sätt beroende på vilken datatyp datat har.

I grund och botten klarar en dator bara av att hantera två saker, nämligen begreppet "1" och begreppet "0" - sant eller falskt. Genom att kombinera dessa binära värden eller bitvärden på olika sätt kan man sedan representera olika datatyper, exempelvis heltalsdata, flyttalsdata, realtalsdata och textsträngar.

I de flesta datorarkitekturer är heltalsdata den grundläggande datatypen, och alla andra datatyper är definierade i termer av denna.

  • Ett heltal representeras exempelvis i moderna datorer normalt av 32 bits - alltså 32 ettor och nollor, där de olika bitarnas position är av betydelse.
  • Ett reellt tal representeras oftast som ett rationellt tal - en kvot mellan två heltalsrepresentationer av exponenter i 2-potenser. Realtalet "2.0" kan alltså representeras av heltalen "2" och "1", där datorn tolkar detta som "22/21", alltså 4/2.
  • Ett flyttal representeras normalt av två realtalsdata - ett realtal för basen och ett realtal för exponenten. Exempel 211/239.
  • En bokstav representeras av ett heltal som mappas på en teckentabell i någon form, exempelvis ASCII-tabellen från USA, någon av tabellerna i ISO 8859, eller den internationella Unicode.

Vissa datatyper är implementerade i själva processorn, vissa implementeras av det programspråk som används vid programmering, och ytterligare andra definieras av den som skriver programmet.

De operationer som kan utföras på ett givet data beror på vilken datatyp datat har. Även om det går att definiera en additionsoperation på bokstavsdata (char, se nedan), så är det sällan meningsfullt, på samma sätt som det inte heller är meningsfullt att kunna sammanfoga två heltal.

Formell beskrivning

Datatyp; tal inom datateknik som representerar en begränsad storhet. Mer avancerade former av datatyper är uppbyggda av de inbyggda datatyper en processor har, vilket även inkluderar funktioner och rutiner då dessa i sig själva representeras av en inbyggd datatyp (s.k. pekare).

Inbyggda datatyper

Olika processorarkitekturer har olika uppsättningar inbyggda datatyper. Vilka typer programspråket gör tillgängliga för programmeraren och vilka namn de betecknas med varierar kraftigt mellan olika programspråk, och i lägre grad även mellan olika implementationer av samma språk. Nedan följer några exempel på typnamn som brukar finnas i språk besläktade med C.

Nyckelord Storlek (bitar) Talrepresentation Storleksintervall
(signed) char 8 Heltal -128...127
unsigned char 8 Heltal 0...255
char (i Java) 16 Unicode-tecken motsvarar 0-0xffff
(signed) short (int) 16 Heltal -32768...32767
unsigned short (int) 16 Heltal 0...65535
(signed) long (int) 32 eller 64 Heltal -231...231-1 eller -263...263-1
unsigned long (int) 32 eller 64 Heltal 0...232-1 eller 0...264-1
(signed) long long 64 Heltal -263...263-1
unsigned long long 64 Heltal 0...264-1
long (i Java) 64 Heltal -263...263-1
int 16, 32 el. 64 Heltal Beror på processorn. Ofta det högsta heltalet, ex. long eller long long.
int (i Java) 32 Heltal -231...231-1
float 16 Flyttal Ingen standard.
Exempel 1: OpenEXP and Cg för NVIDIA: 5 bitars exponent och 10 bitars mantissa[1]
Det finns även historiska exempel på minidatorer under 70-80- talet.
float 32 Flyttal med enkelprecision i 32-bitars arkitekturer IEEE 754-1985: 8 bitar exponent 23 bitar mantissa
double 32 Flyttal med dubbelprecision i 16-bitars arkitekturer IEEE 754-1985: 8 bitar exponent 23 bitar mantissa
double 64 Flyttal IEEE 754-1985: 11 bitar exponent 52 bitar mantissa
long double 64 eller mer Flyttal IEEE 754-1985: 11 bitar exponent 52 bitar mantissa; det finns även icke-standard implementioner, till exempel AIX 128-bitars long double som består av ett par av IEEE 754 64-bitars flyttal som summeras ihop och ger högre precision [2]; i x86-arkitekturen använder man sig även av 80-bit extended precision (80 bits mantissa och 16 bitar exponent, tillsammans 12 bytes).

Tabell över datatyper inom dataprocessorer.

Rationella tal kan även representeras av heltalen char, short och long genom att dela in mantissan i de högre bitarna, och decimalerna i de lägre bitarna. På detta sätt fungerar addition och subtraktion som om de vore rena heltal.

Se även

Referenser