Tal med fortegn i binær: tegn-og-størrelse og 2's komplement
Forstå tal med fortegn i binær: klar guide til tegn-og-størrelse og 2's komplement — eksempler, fordele og praktiske anvendelser.
Repræsentationer af tal med fortegn bruges til at løse problemet med at repræsentere negative heltal i binære tal. Problemet ved at forsøge at gemme det negative tegn (-) i et binært tal er, at der ikke er nogen tilstande tilbage, som kan bruges til at repræsentere den negative tildeling. Det er ikke muligt blot at bruge "off" for minus og "on" for plus, fordi computeren ikke ville have nogen mulighed for at vide, om det var et tal eller et tegn.
For at løse dette problem opfandt computerdesignere to almindelige metoder til lagring af negative binære tal: tegn-og-størrelse (sign-and-magnitude) og 2's komplement. Begge giver alternative repræsentationer for tal med fortegn, men de har forskellige egenskaber, fordele og ulemper.
Tegn-og-størrelse (sign-and-magnitude)
I tegn-og-størrelse bruges én bit (typisk den mest betydende bit) til at angive tegnet: 0 for positivt og 1 for negativt. De resterende bits angiver størrelsen (magnitude) af tallet i almindelig binær form.
Eksempel for 4-bit repræsentation:
- +5 = 0 101
- -5 = 1 101
- +3 = 0 011
- -3 = 1 011
Bemærkninger:
- To repræsentationer af nul: både +0 (0 000) og -0 (1 000) eksisterer, hvilket er upraktisk i beregninger.
- Intervallet: for n bits er intervallet fra -(2^(n-1)-1) til +(2^(n-1)-1).
- Regneoperationer: addition og subtraktion bliver mere komplicerede, fordi man må tage hensyn til tegnet og ofte skifte til forskellige procedurer afhængigt af, om operandernes tegn er ens eller forskellige.
2's komplement
2's komplement er den mest udbredte metode i moderne computere. Her kodes negative tal ved at tage den bitvise negation af tallets absolutte værdi og derefter lægge 1 til. Et vigtigt resultat er, at hver heltalværdig kode repræsenterer ét unikt tal — der er kun ét nul.
Sådan danner man 2's komplement af et positivt tal:
- Find binær repræsentation af absolutværdien i n-1 bits.
- Hvis tallet skal være negativt: invertér alle bits og addér 1.
Eksempel for 4-bit repræsentation:
- +5 = 0101
- -5: invertér 0101 → 1010, læg 1 til → 1011 (dvs. -5 = 1011)
- 0 = 0000 (kun én nul)
Væsentlige egenskaber:
- Intervallet: for n bits går intervallet fra -2^(n-1) til 2^(n-1)-1. For eksempel i 8-bit: -128 til 127.
- Enkelt nul: kun én repræsentation af nul (0000...0).
- Enkle aritmetiske operationer: addition og subtraktion kan udføres med samme binære addere som for usignerede tal; negative tal håndteres automatisk af repræsentationen (dog skal man være opmærksom på overflow).
- Overflow-detektion: ved addition i 2's komplement opstår overflow, hvis carry ind i fortegnsbit er forskellig fra carry ud af fortegnsbit. Alternativt: hvis to positive tal giver negativt resultat, eller to negative tal giver positivt resultat.
- Sign-udvidelse: når man udvider et tal til flere bits (fx fra 8 til 16), kopierer man fortegnsbit for at bevare værdien (sign-extension).
Sammenligning og praktiske konsekvenser
- Hvorfor 2's komplement oftere bruges: det har kun ét nul og tillader enklere og hurtigere hardware for aritmetik. Dette gør det til standarden i næsten alle moderne processorer.
- Tegn-og-størrelse kan være intuitivt: det matcher menneskelig idé om "et tegn og en absolutværdi", men det fører til komplicerede aritmetiske regler og dobbelt nul, hvilket gør det mindre egnet til maskinnær beregning.
- Når man vælger bitlængde: husk intervallet for den valgte repræsentation. I 8-bit 2's komplement kan du fx repræsentere -128 — 127, mens tegn-og-størrelse kun når -127 — +127 med to nulpunkter.
Eksempel på addition i 2's komplement
Tag 4-bit talene +6 (0110) og -3 (1101).
- 0110 (+6)
- 1101 (-3)
- Sum (binært add): 0110 + 1101 = 10011 → med 4 bits resultatet 0011 (ignorer overflødig carry ud), hvilket er +3. Det er korrekt: 6 + (-3) = 3.
Praktiske tips
- Ved programmering på lavt niveau eller når du arbejder med binære protokoller, vær opmærksom på hvilken repræsentation (signed/unsigned) datasættet bruger.
- Ved konvertering mellem bitlængder, brug sign-extension for signed tal i 2's komplement for at bevare tallets værdi.
- For fejlsøgning af overflow: i maskinkode kontrolleres ofte processorens overflow-flag (V eller OF) eller kontrol af carry ind/ud i fortegnsbit.
Samlet set er både tegn-og-størrelse og 2's komplement måder at løse problemet med at repræsentere negative tal i binære systemer. 2's komplement er dog den praktisk foretrukne metode i næsten alle moderne systemer på grund af sin effektivitet og enklere aritmetik.
Tegn-og-magnitude
Sign and Magnitude fungerer ved at ændre den mest betydningsfulde bit (MSB - det første ciffer) til en 1, hvis tallet er negativt, og reducere tallet med f.eks. én:
0000 0010 (2)
vil blive...
1000 0010 (-2)
Denne metode til lagring af negative binære tal fungerer ikke, fordi:
- Binær aritmetik virker ikke.
- Vi skal først vide, hvilken lagringsmekanisme kompileren til et bestemt sprog anvender.
1's komplement
1's Complement fungerer ved at bytte 1'er ud med 0'er og 0'er med 1'er for eksempel:
0000 0010 (2)
vil blive...
1111 1101 (-2)
Ligesom med tegn-og-magnitude-metoden kan dette nemt defineres som et negativt tal, fordi den mest betydningsfulde bit er 1
2's komplement
2's komplement er en vanskeligere måde at gemme negativer på. Der er tre trin til det:
- Find det positive binære tal (f.eks. 8base 10 = 0000 1000base 2).
- Udskift 1'erne med 0'er og 0'erne med 1'er (f.eks. 0000 1000base 2 bliver til 1111 0111base 2).
Dette kaldes at "vende bitsene", eller at anvende logisk NOT på den oprindelige base 2-repræsentation.
- Tilføj 1 (f.eks. 1111 0111base 2 + 1base 2 = 1111 1000base 2).
Denne metode er populær, fordi:
- Det er ligesom tegn og størrelse; et negativt tal starter med et 1-tal og et positivt tal starter med et 0-tal.
- Den binære aritmetik vil fungere.
- Der er kun én værdi for 0 (0000 0000 0000base 2).
Søge