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.
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. |
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 andra implementationer utöver standarden:
|
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
- Janlert, Lars-Erik, 1950- (2000 ;). Datatyper och algoritmer. Studentlitteratur. ISBN 9144013647. OCLC 186568746. http://worldcat.org/oclc/186568746. Läst 4 juni 2019
Se även
Referenser
- ^ Exempel på användning av 16-bitars float.
- ^ ”Arkiverade kopian”. Arkiverad från originalet den 5 januari 2007. https://web.archive.org/web/20070105034359/http://www.unet.univie.ac.at/aix/aixprggd/genprogc/128bit_long_double_floating-point_datatype.htm. Läst 3 januari 2007.