Dodatek do Wyk‚adu 01: Kodowanie liczb w komputerze 14mstygar/files/kodowanie-liczb...  10. Na przyk‚ad

  • View
    214

  • Download
    0

Embed Size (px)

Text of Dodatek do Wyk‚adu 01: Kodowanie liczb w komputerze 14mstygar/files/kodowanie-liczb... ...

Dodatek do Wykadu 01: Kodowanie liczb w komputerze [materia ze strony: http://sigma.wsb-nlu.edu.pl/~szyszkin/]

Wszelkie dane zapamitywane przetwarzane przez komputery musz by odpowiednio zakodowane. Z powodw technicznych najwygodniej jest realizowa ukady, w ktrych s rozrnialne dwa stany. Stany te bdziemy dla wygody oznaczali symbolami 0 i 1. Tak wic w pamici komputera znajduj si same cigi zer i jedynek. Na og s one grupowane w pewne wiksze porcje: osiem bitw to bajt (zwany czasami oktetem), szesnacie bitw to pojedyncze sowo. Dokadna terminologia zaley przede wszystkim od architektury danego sytemu komputerowego (gwnie chodzi o procesor i pami), ale bajt jest standardem. Tak wic w komputerze omiobitowym w pamici mamy komrki, w ktrych znajduj si porcje po osiem bitw (np. jedne z pierwszych procesorw firmy Intel (1974 r.) oznaczane jako 8008, 8080 byy omiobitowe1). Tak wic fragment pamici moemy sobie wyobrazi nastpujco:

1 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1

Z drugiej strony, aby efektywnie przetwarza dane np. uywajc jzykw programowania do pisania odpowiednich programw potrzebujemy bardziej abstrakcyjnych poj takich, jak liczby cakowite, liczby wymierne (z czci po przecinku dziesitnym), znaki tekstowe. Wszystkie te obiekty musz by jednak zapamitane w postaci cigw zer i jedynek.

Aby to zrobi efektywnie naley umwi si co do sposobu kodowania tych obiektw. Jak reprezentowa liczby 20, -31, 124.12, symbole A, a czy x?

Mimo, e od strony czysto matematycznej liczby wymierne s rozszerzeniem zbioru liczb cakowitych, to w technice komputerowej stosuje si zupenie inne sposoby kodowania dla liczb cakowitych i liczb wymiernych. Std w wikszoci jzykw programowania rozrnia si generalnie typy cakowitoliczbowe (np. int, short w jzyku C/C++) od typw nie cakowitoliczbowych (np. float, double w jzyku C/C++). Ze wzgldu na sposb reprezentacji uywa si tutaj czsto okrelenia typy staoprzecinkowe i typy zmiennoprzecinkowe.

Reprezentacje liczb cakowitych

Kodowanie NKB i U1

Podstaw jest tutaj tzw. naturalny kod binarny (NKB). Jest to reprezentacja analogiczna do uywanej na co dzie, gdy posugujemy si liczbami cakowitymi, czyli zapis pozycyjnym o podstawie 10. Na przykad w ukadzie dziesitnym zapis 24564 znaczy tyle co

1 Podstawowe rejestry tych dwch procesorw byy 8-bitowe, ale byy one w stanie uywa adresw 16-bitowych. Tak wic ich przestrze adresowa wynosia 216=64 K. Wsppracoway one z 8-bitow szyn danych, dlatego najbardziej naturaln pamici bya taka, w ktrej organizacja bya 8-bitowa.

4 3 2 1 024564 2 10 4 10 5 10 6 10 4 10 .= + + + +

Do takiego kodowania potrzebujemy dziesiciu symboli (cyfr) 0,1,2,3,4,5,6,7,8,9 co nie jest praktyczne przy realizacji sprztowej, tak wic uywamy podstawy 2, co wymaga tylko dwch symboli 0, 1. Oznacza to, e np. cig bitw 10100110 interpretujemy jako 102, gdy:

0 1 2 3 4 5 6 72(01100110) 0 2 1 2 1 2 0 2 0 2 1 2 1 2 0 2 102.= + + + + + + + =

Problem pojawi si gdy bdziemy chcieli reprezentowa liczby cakowite ze znakiem. Jak zapisa tylko przy pomocy 0 i 1 liczb 102? Jednym z rozwiza jest wprowadzenie tzw. bitu znaku: pierwszy bit (liczc od lewej strony), nie oznacza wagi, ale informuje o znaku: 1 oznacza (minus), a 0 oznacza + (plus). Takie kodowanie nazywamy kodem uzupenie do jeden (U1). Tak wic: cig 10011001 oznacza:

w kodzie U1: -25

w kodzie NKB: 153

Zauwamy, e w kodze U1 mamy dwie reprezentacje zera, czyli dwa rna cigi naley interpretowa jako jedno matematyczne 0:

10000000 = -0 = 0

00000000 = +0 = 0

Kod U1 mimo, e bardzo prosty i oczywisty nie jest jednak uywany w praktyce. Wynika to przede wszystkim z tego, e bardzo niewygodnie realizuje si w nim operacje dodawania czy mnoenia. Nie wystarczy zwyka suma bitowa z przeniesieniem.

Przykad 1

1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1

Jak wida zwyke dodawanie bitowe z przeniesieniem prowadzi do niepoprawnych wynikw. Oznacza to, e do obsugi liczb cakowitych ze znakiem kodowanych w systemie U1 naleaoby wykorzysta bardziej skomplikowane algorytmy (zrealizowane sprztowo lub programowo).

Kodowanie U2

Zakadamy, e uywamy zawsze porcji (cigw) bitw o dugoci n (w praktyce komputerowej jest to 8, 16, 32, 64 czy 128).

Cig zer i jedynek o dugoci n interpretujemy w kodzie U2 jako nastpujc warto:

1 2 1 0

1 2 1 0 2 1 2 1 0( ... ) 2 2 ... 2 2 .n n

n n U n nx x x x x x x x

= + + + +

-48

19

-67

Tak wic mamy

2 1 0 2 11 2 1 0 2 12 1 0 2 1

( ) gdy 0,( ... )

2 ( ) gdy 1.n n

n n U nn n

x x x xx x x x

x x x x

== + =

(0.1)

Przykad 2

Dysponujemy maszyn omiobitow. Naturalne jest wic uywanie kodu U2 z 8.n = Jakim liczbom cakowitym odpowiadaj nastpujce sekwencje znajdujce si w pamici?

1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0

Dla pierwszego cigu mamy 7 6 5 4 3 2 1 0

2(11011001) 2 1 2 0 2 1 2 1 2 0 2 0 2 1 2128 64 16 8 1 39.

U = + + + + + + + == + + + + =

a dla drugiego cigu 7 6 5 4 3 2 1 0

2(00001110) 0 2 0 2 0 2 0 2 1 2 1 2 1 2 0 28 4 2 14.

U = + + + + + + + == + + =

Jaka jest najwiksza liczba dodatnia, ktr mona zapisa uywajc kodu U2 dla n=8 lub n=16?

Aby uzyska liczb dodatni pierwszy (od lewej) bit musi by 0. Jeeli pozostae bd rwne 1, to uzyskamy

6 5 4 3 2 1 02

214 13 12 11 10 8 7 6 5 4 3 2 1 0

(01111111) 2 2 2 2 2 2 2 127.(0111111111111111)

2 2 2 2 2 2 2 2 2 2 2 2 2 2 32767

U

U

= + + + + + + ==

= + + + + + + + + + + + + + =

Oglnie dla reprezentacji n bitowej najwiksza liczba w kodzie U2 to 12(011111 111) 2 1.

nU

= Jaka jest najbardziej ujemna liczba, ktr mona zapisa uywajc kodu U2 dla n=8 lub n=16?

Liczby ujemne w kodzie U2 maj 1 na pierwszej (od lewej) pozycji. Aby uzyska liczb ujemna o najwikszej wartoci bezwzgldnej, widzimy ze wzoru (0.1), e pozostae bity musz by rwne 0. Tak wic

7 6 5 4 3 2 1 02(10000000) 2 0 2 0 2 0 2 0 2 0 2 0 2 0 2 128.U = + + + + + + + = Analogicznie dla kodu 16-bitowego U2 mamy 15 16 02(1000000000000000) 2 0 2 0 2 32768.U = + + + =

Oglnie dla kodw o dugoci n w reprezentacji U2 najbardziej ujemna liczba to

12(10000 000) 2 .n

U=

Ile rnych liczb cakowitych mona zapisa uywajc kodu U1 i U2 dla n=8 lub n=16?

Z powyszych przykadw wida, e podzbiory liczb cakowitych, kodowane metod U2 s nastpujce. Dla 8n = to { 128, , 1,0,1, ,127},

a dla n=16 to { 32768, , 1,0,1, 32767}.

Oglnie dla reprezentacji n bitowej mamy zakres

1 1{ 2 , , 2 1}.n n Liczba zakodowanych wartoci wynosi oczywicie 2 .n Zalety kodu U2:

jednoznaczna reprezentacja liczby 0

atwa realizacja dodawania i odejmowania

Dodawanie dwch liczb zapisanych w kodzie U2 mona wykona wykonujc zwyke dodawanie

binarne z przeniesieniem. Tak dugo jak nie ma przepenienia wyniki wychodz poprawne.

Przykad

Poniej s pokazane liczby w pamici 8-bitowej, ktre interpretujemy jak liczby cakowite zapisane w kodzie U2. Wykonajmy dodawanie (dwa pierwsze rzdy) metod bitow z przenoszeniem, aby przekona si, e wyniki s poprawne.

1 0 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0

Przykad

Wykona dodawanie nastpujcych par liczb po zakodowaniu ich w kodzie U2:

a) x = -25, y = 80

b) x = -68, y = 92

c) x = -37, y = 37

Odejmowanie liczb jest oczywicie szczeglnym przypadkiem dodawania. Warto jednak omwi osobno to dziaanie, aby zobaczy jak prosto w kodzie U2 mona uzyska liczb przeciwn do danej.

Jeeli mamy zakodowan liczb 1 1{ 2 , , 2 1}n nx

2 1 2 0 2( ) ( , , ) ,U n n Ux x x x = (0.2)

to liczb przeciwn, ,x uzyskujemy przez negacj bitow reprezentacji wyjciowej i dodanie bitowe jedynki. Tak wic reprezentacj w kodzie U2 liczby ujemnej moemy uzyska nastpujcym wzorem

-109

69

-40

-109+69=-40

( )2 2( ) | | 1,Ux x = +

gdzie kreska oznacza negacj bitow, czyli 1 0= oraz 0 1.=

Przykad

Zakadamy, e liczby s reprezentowane omiobitowo ( 8).n = Chcemy poda reprezentacj U2 liczby 42.

Obliczamy reprezentacj liczby | |42 42 :x = =

0 0 1 0 1 0 1 0

Dokonujemy zaprzeczenia bitowego powyszego kodu, zatem (| |) :x

1 1 0 1 0 1 0 1

Dodajemy bitowo jedynk, czyli obliczamy ( )2| | 1:x + 1 1 0 1 0 1 1 0

Sprawdzamy:

7 6 4 2 12(11010110) 2 2 2 2 2 128 64 16 4 2 128 86 42.U = + + + + = + + + + = + = Jeszcze jeden przykad, liczba 108. | |108 108 : =

0 1 1 0 1 1 0 0

(| 108|) :

1 0 0 1 0 0 1 1

(| 108|) 1: +

1 0 0 1 0 1 0 0 Sprawdzamy:

7 4 22(10010100) 2 2 2 128 16 4 108.U = + + = + + =

Zauwamy, e w kodzie U2 powielenie najstarszego (pierwszego od lewej) bitu nie zmienia wartoci liczby. Na przykad powielanego bitu 1 mamy

4 2 12

5 4 2 12

6 5 4 2 12

(10110) 2 2 2 16 6 10,

(110110) 2 2 2 2 32 16 4 2 10

(1110110) 2 2 2 2 2 64 32 16 4 2 10

U

U

U

= + + = + =

= + + + = + + + =

= + + + + = + + + + =

W przypadku, gdy powielamy bit 0 jest to oczywiste (w rozwiniciu w ogle nic si nie zmienia).

Podsumujmy podstawowe wasnoci kodu uzupenie do dwch.

Najstarszy (pierwszy od lewej) bit informuje o znaku liczby. Bit 0 maj liczby nieujemne, bit 1 maj liczby ujemne. Np. 3 1 02(1011) 2 2 2 5.U = + + =