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.
Binære tall
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} \)
ADDISJON AV BINÆRE TALL
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.
Positive heltall
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:
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 |
Negative heltall
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:
- Fortegn pluss verdi
- Invertering av den positive ekvivalent
- «Two's complement» (komplementær to-form)
1. fortegn pluss verdi
Fortegnet er negativt (1) de andre bitene brukes på vanlig måte til å representere tallets verdi. For eksempel -2 skrives slik: 1 010.
2. Invertering av den positive ekvivalent
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.
3. «Two's complement» — komplementær to-form
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.
Verdiområder
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