[go: up one dir, main page]

Tilbake til artikkelen

Tilbake til historikken

heltall – representasjon

Versj. 33
Denne versjonen ble publisert av Kjell Bratbergsengen 22. august 2017. Artikkelen endret 234 tegn fra forrige versjon.

Heltall, om lagring av heltall i datasystemer. Heltall lagres som et antall binære siffer (0,1) i to-tallsystemet. Ett siffer lagres i ett bit. Hvilket verdiområde (fra minste til største tall) som dekkes bestemmes av antall siffer (bit) og om det skal lagre bare positive heltall, eller både positive og negative heltall. Negative heltall kan lagres på tre forskjellige måter, og komplementær to-form har blitt den dominerende metoden. Alternativene er forklart nedenfor.

Vi er vant til heltall på desimal form, - i ti-tallsystemet. En enkel og praktisk huskeregel er at ti binære sifre (bit) gir omtrent tre desimale sifre. Med ti bit kan vi lagre tall opp til tusen, med 20 bit er største tallet 1 million og med 30 bit er største tallet 1 milliard.

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.

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{ eksempel: 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.

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\).

Les mer i Store norske leksikon