Datatyp

I programspråk är en datatyp ett attribut för data som berättar för datorn (och programmeraren) vilken sorts information data 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 det körs, eftersom programmet tror att datan representerar något annat än vad den egentligen innehåller. 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

Med primitiva datatyper menas de grundläggande typer som tillhandahålls direkt av programspråket, såsom heltal, flyttal och boolska värden, och vilka ofta fungerar som byggstenar till mer komplexa typer. Till skillnad från sammansatta och abstrakta typer, är det i de flesta programspråk inte tillåtet för ett program att förändra eller omdefiniera språkets primitiva typer.

Abstrakta typer

En abstrakt datatyp är en datatyp som, förutom att definiera vilken sorts data som lagras (datatyp), även definierar de operationer som är tillåtna på data av detta slag. Man säger att en abstrakt datatyp kapslar in datan tillsammans med de operationer som kan utföras på datan.

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 datatypen utan att behöva göra några antaganden om hur den underliggande implementationen är utförd.

Listor är ett exempel på en abstrakt datatyp. En lista består dels av sina rader (listans data), men också av möjligheten att lägga till och stryka bort rader (listans operationer). API:et för den abstrakta datatypen Lista skulle således kunna definiera följande operationer:

  • Create (skapa listan)
  • Add (lägg till rad)
  • Get (hämta en viss rad från listan)
  • Remove (ta bort eller stryk över rader)
  • Destroy (riv sönder eller kasta bort listan)

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

Pekare och referenstyper

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 datan 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å en given bit data beror på vilken datatyp datan 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.

NyckelordStorlek (bitar)TalrepresentationStorleksintervall
(signed) char8Heltal-128...127
unsigned char8Heltal0...255
char (i Java)16Unicode-teckenmotsvarar 0-0xffff
(signed) short (int)16Heltal-32768...32767
unsigned short (int)16Heltal0...65535
(signed) long (int)32 eller 64Heltal-231...231-1 eller -263...263-1
unsigned long (int)32 eller 64Heltal0...232-1 eller 0...264-1
(signed) long long64Heltal-263...263-1
unsigned long long64Heltal0...264-1
long (i Java)64Heltal-263...263-1
int16, 32 el. 64HeltalBeror på processorn. Ofta det högsta heltalet, ex. long eller long long.
int (i Java)32Heltal-231...231-1
float16FlyttalIngen standard.
float32Flyttal med enkelprecision i 32-bitars arkitekturerIEEE 754-1985: 8 bitar exponent, 23 bitar mantissa
double32Flyttal med dubbelprecision i 16-bitars arkitekturerIEEE 754-1985: 8 bitar exponent, 23 bitar mantissa
double64FlyttalIEEE 754-1985: 11 bitar exponent, 52 bitar mantissa
long double64 eller merFlyttalIEEE 754-1985: 11 bitar exponent, 52 bitar mantissa. Det finns även andra implementationer utöver standarden:
  • I operativsystemet AIX består 128-bitars long double av två stycken enligt IEEE 754 definierade 64-bitars flyttal. Summan av dessa två 64-bitars flyttal ger värdet på 128-bitarstalet.[2]
  • I x86-arkitekturen använder man sig även av 80-bit extended precision (80 bitar 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 (se Flyttal) 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.

Litteratur

Se även

Referenser