Heltall, i datasystemer representeres med et antall binære siffer (0,1) i to-tallsystemet. Hvilket verdiområde som dekkes bestemmes av antall siffer som kan brukes og om det skal representeres bare positive heltall eller både positive og negative heltall. Dette gjelder tall som brukes i beregninger. Tall som bare skal lagres kan også lagres som vanlig tekst. Lagringsformatet (representasjonen) har betydning når data deles og flyttes mellom maskiner.
Binære tall
Grunntallet er 2 og et binært siffer kan ta to verdier: 0 og 1. Vekten til et siffer er \(2^p\) hvor \(p\) er sifferets posisjon, se figuren under.
\( \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 compliment» (komplimentæ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\).
En enkel og praktisk huskeregel er at ti binære sifre gir omtrent tre desimale sifre. Med ti sifre (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.