[go: up one dir, main page]

Tilbake til artikkelen

Tilbake til historikken

heltall – representasjon

Versj. 41
Denne versjonen ble publisert av Ola Nordal 24. august 2017. Artikkelen endret 0 tegn fra forrige versjon.

Heltall er alle naturlige tall (0, 1, 2, 3, 4...) og deres negative verdier (-1, -2, -3, -4...). Heltall omfatter altså ikke tall med desimaler.

I datamaskiner lagres (representeres) heltall som et antall binære siffer (0,1) i to-tallsystemet. Ett siffer lagres i én bit. Hvilket verdiområde som dekkes (altså fra minste til største tall) bestemmes av antall bits (normalt 8 bit, 16 bit, 32 bit eller 64 bit) og om det skal lagre bare positive heltall, eller bådepositive og negative heltall. Negative heltall kan lagres på tre forskjellige måter, og «komplementær to-form» har blitt den dominerende metoden.

Lagringsformatet (representasjonen) har betydning når data deles og flyttes mellom maskiner.

I digital representasjon er grunntallet 2 og et binært siffer kan ta to verdier: 0 og 1. Vekten til et siffer bestemmes av sifferets posisjon i det bimære tallet, og er \(2^p\) hvor \(p\) er posisjon, se figuren under. En starter med posisjon 0 som er lengst til høyre i tallet. Vekten dobles for hver posisjon en går til venstre.

\( \begin{array}{ccccccccl} 7&6&5&4&3&2&1&0& \texttt{ posisjon}\\ 2^7&2^6&2^5&2^4&2^3&2^2&2^1&2^0& \texttt{ vekt}\\ 128&64&32&16&8&4&2&1& \texttt{ vekt, desimaltall} \\ 0&1&0&0&1&0&1&1& \texttt{ binærtall: 64+8+2+1=75} \end{array} \)

Operasjonen addisjon er sentral fordi operasjonen subtraksjon også kan løses ved addisjon. Eksempel: \( 7 - 3 \equiv 7+(-3) = 4 \). Tegnet \( \equiv \) leses som «ekvivalent med» eller «er det samme som».

Under viser vi to eksempler på addisjon av binære tall:

\( \begin{array}{r@{:}cccccr} \texttt{mente} & &\tiny{1} & \tiny{1} & \tiny{1} & & \texttt{dv} \\ &&0&1&1&1 & 7 \\ \texttt{+} &&0&1&0&1&5\\ \texttt{sum} &&1&1&0& 0 & 12 \end{array} \texttt{ } \begin{array}{r@{:}cccccr} \texttt{mente} & \tiny{1} &\tiny{1} & \tiny{0} & \tiny{1} & & \texttt{dv} \\ &&1&1&0&1 & 13 \\ \texttt{+} &&0&1&0&1&5\\ \texttt{sum} &1&0&0&1& 0 & 18(2) \end{array} \)

Kolonnene med overskrift \( \texttt{dv} \) viser binærtallets desimale verdi. I det siste eksemplet har vi addert to tall som gir et større resultat enn det er plass til i fire bit. Denne situasjonen kalles overflyt, som er direkte oversatt fra engelske «overflow». Ved overflyt får en ikke riktig resultat, derfor står det 2 i parentesen etter 18. CPU-er har en egen instruksjon som kan teste om siste addisjon har gitt overflyt.

Tall i tekst er lagret som tekst, det vil si at hvert tegn har sin tegnkode. I tegnsettet ASCII har de desimale sifrene 0 til 9 tegnkodene fra 48 til 57. Før en skal gjøre beregninger med tall på tekstlig form er det nødvendig å konvertere fra desimal til binær form, altså en konvertering fra et tall i ti-tallsystemet til et tall i to-tallsystemet.

En enkel og praktisk huskeregel er at ti binære sifre gir omtrent tre desimale sifre. Med ti bit kan vi lagre tall opp til 1000. Med 20 bit er største tallet 1 million og med 30 bit er største tallet 1 milliard.

Alle sifferposisjoner brukes til å bestemme tallverdien. Et binært tall med \(n\) siffer kan representere verdier i området \( 0 \texttt{ til } 2^n-1 \). For vanlige ordlengder får vi da følgende verdiområder:

Verdiområder for positive heltall
antall siffer verdiområde datatype
8 0 til 255 char
16 0 til 65 535 ushort
32 0 til 4 294 967 295 uint
64 0 til 18 446 744 073 709 551 615 ulong

Når en lagrer negative og positive heltall tolkes mest signifikante bit (høyeste posisjon) som fortegn: 0 for positive heltall og 1 for negative heltall.

Negative tall kan representeres på tre måter:

  1. Fortegn pluss verdi
  2. Invertering av den positive ekvivalent
  3. «Two's complement» (komplementær to-form)

Fortegnet er negativt (1) de andre bitene brukes på vanlig måte til å representere tallets verdi. For eksempel -2 skrives slik: 1 010.

Dette innebærer at alle bitene inverteres: 0 blir 1 og 1 blir 0. Tallet 2 skrives slik binært når vi bruker fire bit: 0010. -2 blir da: 1101. Denne lagringsformen fører også til at en får to verdier for 0: 0000 = +0 og 1111= -0.

Lagringsformen kalles «one's complement» eller «komplementær en-form», og ble brukt av datamaskiner som var vanlige i Norge i perioden 1960-1990, for eksempel UNIVAC 1100-serien, CDC 3000 og 6000 seriene og PDP-1.

Det negative tallet representeres som den inverterte formen («one's complement») pluss 1. Dermed unngår man åpentbart to former for 0, og i tillegg får en enklere elektronikk for å utføre de vanlige regneoperasjonene addisjon og subtraksjon.

La oss først se på representasjonen av -2:

\( \begin{array}{r@{:}ccccl} +2 &0&0&1&0& \\ \bar{2} &1&1&0&1& \texttt{invertert}\\+1 &0&0&0&1& \texttt{adder 1}\\=-2 &1&1&1&0& \\ \end{array} \)

Den positive ekvivalenten av -2 som er +2 blir først invertert, deretter adderes 1 til det inverterte tallet.

For å demonstrere at lagringsformen fungerer viser vi to eksempler. Først adderer vi 4 og -2:

\( \begin{array}{r@{:}cccc} 4&0&1&0&0 \\ +(-2) &1&1&1&0\\ =2&0&0&1&0 \end{array} \)

Og en ny test: -2+(-2):

\( \begin{array}{r@{:}cccc} -2&1&1&1&0\\ +(-2)&1&1&1&0\\ =-4&1&1&0&0 \end{array} \)

Komplementær to-form har blitt den dominerende måte å lagre heltall på. Både addisjon og subtraksjon kan utføres som addisjon når heltall er lagret på denne måten. Norsk Data AS (1967-1992) sine Nord-maskiner lagret heltall på komplementær to-form.

Med \(n\) bit til rådighet er tallområdet \( \pm 2^{n-1}-1\) for de to lagringsformatene: lagring med fortegn pluss absoluttverdi og komplementær en-form. Verdiområdet med komplementær to-formlagring er \( -2^{n-1} \texttt{ til } 2^{n-1}-1\).