background image

Zapis liczb binarnych ze 

znakiem

background image

W tej prezentacji:



Zapis Znak-Moduł (ZM)



Zapis uzupełnień do 1 (U1)



Zapis uzupełnień do 2 (U2)

background image



Koncepcyjnie zapis znak - moduł 

(w skrócie ZM - ang. 

SM Signed Magnitude)

jest najbardziej zbliżony do 

systemu zapisu liczb używanego przez nas samych. 
Liczba ZM składa się z dwóch części - bitu znaku oraz 
bitów wartości liczby 

(modułu)

:

b

n-1

b

n-2

b

n-3

... b

2

b

1

b

0

b

n-1

- bit znaku liczby

b

n-3

... b

0

- bity modułu liczby



Dla liczb dodatnich i zera bit znaku ma wartość 0, dla 
liczb ujemnych i zera ma wartość 1. Format zapisu ZM
musi być ściśle ustalony, aby wiadomo było, który bit jest 

bitem znaku - w operacjach arytmetycznych bit znaku 
musimy traktować inaczej niż inne bity.

Zapis Znak-Moduł (ZM)

background image

Wartość dziesiętna liczby
w zapisie ZM



Moduł liczby ZM jest zapisany w 

naturalnym kodzie 

dwójkowym NBC

, zatem w celu obliczenia jej wartości 

moduł mnożymy przez 1, gdy bit znaku wynosi 0 lub 
przez -1, gdy bit znaku wynosi 1. Wzór jest nast
ępujący:

L

ZM

(-1)

bit znaku

x

moduł liczby



Rozpisując poszczególne bity otrzymujemy:

b

n-1

b

n-2

...b

2

b

1

b

0

=

(-1)b

n-1

(b

n-2

2

n-2

+ ... + b

2

2

2

+ b

1

2

1

+ b

0

2

0

)

gdzie

b

- bit, cyfra dwójkowa 0 lub 1

n

- liczba bitów w zapisie liczby

background image

Przykład 1



Obliczyć wartość dziesiętną liczby 10110111

(ZM)

.



Pierwszy bit zapisu ZM jest bitem znaku. Wartość 1 
informuje nas, iż jest to liczba ujemna. Pozostałe bity 
tworzą wartość liczby. 



Moduł jest zapisany w 

naturalnym systemie dwójkowym

zatem:

1

0110111

(ZM)

(-1)

1

(2

5

+ 2

4

+ 2

2

+ 2

1

+ 2

0

)

1

0110111

(ZM)

= - (32 + 16 + 4 + 2 + 1)

1

0110111

(ZM)

= - 55

(10)

background image

Przykład 2



Obliczyć wartość dziesiętną liczby 00011111

(ZM)

.



Bit znaku ma wartość 0, zatem jest to liczba dodatnia. 
Wartość tej liczby jest równa wartości jej modułu 
zapisanego w 

naturalnym kodzie dwójkowym

.

0

0011111

(ZM)

(-1)

0

(2

4

+ 2

3

+ 2

2

+ 2

1

+ 2

0

)

0

0011111

(ZM)

= (16 + 8 + 4 + 2 + 1)

0

0011111

(ZM)

= 31

(10)

background image

Procedura wyznaczania zapisu ZM liczby 
dziesiętnej

1.

Jeśli liczba jest dodatnia, to bit znaku ma wartość 0. W 
przeciwnym razie bit znaku ma wartość 1. 

2.

Obliczamy wartość absolutną liczby, czyli jej moduł. 

3.

Wyznaczamy bity modułu 

4.

Otrzymane bity modułu uzupełniamy w miarę potrzeby 
bitami o wartości 0, aby otrzymać ustaloną w formacie 
liczbę bitów dla modułu. 

5.

Do bitów modułu dodajemy bit znaku i otrzymujemy 
zapis ZM.

background image

Przykład

Przedstawić w 8-mio bitowym kodzie ZM liczbę o 

wartości dziesiętnej -9. 



Wyznaczamy bit znaku. Liczba -9 jest ujemna, zatem b

7

= 1

(najstarszy bit)



Wartość absolutna z -9 to 9

(po prostu opuszcza się 

znak -)



Obliczamy

zapis dwójkowy

modułu 9

(10)

= 1001

(2)



Moduł 8-mio bitowej liczby ZM składa się z 7 bitów, 

zatem do otrzymanego wyniku dodajemy trzy 

początkowe zera otrzymując 0001001. 



Łączymy bit znaku 1 z bitami modułu 0001001 i 
dostajemy zapis ZM liczby -9

(10)

= 10001001

(ZM)

background image

Zakres liczb w zapisie ZM

Zadanie polega na znalezieniu najmniejszej i 
największej wartości liczby, którą da się przedstawić w 
danym zapisie ZM. Łatwo zauważyć, że w obu 

przypadkach moduł musi mieć wartość maksymalną, a 
bit znaku 1 dla wartości najmniejszej i 0 dla wartości 
największej. Ponieważ moduł jest zapisany w 

naturalnym kodzie dwójkowym NBC, jego wartość jest 
równa 

maksymalnej wartości

n-1 bitowej liczby 

dwójkowej. Dla bitów otrzymujemy:

min

(ZM)

1b

n-2

b

n-3

...b

2

b

1

b

0

= (-1) (b

n-2

2

n-2

+ b

n-3

2

n-3

+ ...b

2

2

2

+ b

1

2

1

+ b

0

2

0

) = -2

n-1

+ 1

max

(ZM)

0b

n-2

b

n-3

...b

2

b

1

b

0

= 1 (b

n-2

2

n-2

+ b

n-3

2

n-3

+ ...b

2

2

2

+ b

1

2

1

+ b

0

2

0

) = 2

n-1

- 1

background image

Zakres liczby w zapisie ZM

Zakres bitowej liczby w kodzie ZM wynosi

Z

(ZM)

= <-2

n-1

+ 1, 2

n-1 

- 1>

background image

Zapis U1



Drugim podejściem do rozwiązania problemu 
liczb ze znakiem jest system uzupełnień do 1 
zwany systemem U1

(ang. 1C - One's

Complement)



W systemie tym wszystkie bity zapisu liczby 
posiadają swoje wagi 

(w ZM bit znaku nie 

posiadał wagi)



Najstarszy bit jest bitem znaku i ma wagę równą 
(-2

n-1

+1)

, gdzie oznacza ilość bitów w zapisie 

liczby. 



Pozostałe bity posiadają wagi takie jak w 

naturalnym systemie dwójkowym

background image

Wartość dziesiętna liczby w zapisie U1

Wartość  liczby  U1  obliczamy  zgodnie  z 

poznanymi  zasadami

- cyfry  mnożymy  przez 

wagi pozycji, na których się znajdują i dodajemy 
otrzymane iloczyny:

b

n-1

b

n-2

b

n-3

...b

2

b

1

b

0 (U1)

b

n-1

(-2

n-1

+1)

b

n-2

2

n-2

b

n-3

2

n-3

+ ... + 

b

2

2

2

b

1

2

1

b

0

2

0

gdzie:

b

- bit, cyfra dwójkowa 0 lub 1

n

- liczba bitów w zapisie liczby

background image

Przeliczanie liczb dziesiętnych
na zapis U1



Jeśli liczba jest dodatnia, to najstarszy bit znakowy 
posiada wartość 

0

. Pozostałe bity służą do zapisu liczby 

w naturalnym kodzie binarnym:

0

111

(U1)

= 7

(10)

0

001

(U1)

= 1

(10)

0

1111111

(U1)

= 127

(10)



Jeśli liczba jest ujemna, to najstarszy bit znakowy ma 
wartość 

1

. Pozostałe bity są 

negacjami

bitów modułu 

wartości liczby:

1

101

(U1)

=  (-2)

(10)

moduł 2

(10)

=  010

(2)

:  NOT 010  = 

101

1

100

(U1)

=  (-3)

(10)

moduł 3

(10)

=  011

(2)

:  NOT 011  = 

100

1

010

(U1)

= (-5)

(10)

moduł 5

(10)

= 101

(2)

NOT 101 =

010

background image

Procedura wyznaczania zapisu U1 
dla liczby dziesiętnej

1.

Jeśli  liczba

jest  dodatnia,  znajdujemy  jej 

reprezentację  w  naturalnym  kodzie  binarnym  i 
uzupełniamy  bitami  o  wartości  0 do  uzyskania 
zadanej  liczby  bitów  wymaganej  przez  przyjęty 
format zapisu U1. 

2.

Jeśli  liczba jest  ujemna,  obliczamy  jej  moduł
Moduł

przedstawiamy  w  naturalnym  systemie 

dwójkowym  uzupełniając  go  bitami  o  wartości  0
do  długości  przyjętego  formatu  U1.  Następnie 
wszystkie  bity  zamieniamy  na  przeciwne  i  w 
wyniku otrzymujemy zapis U1.

background image

Przykład 1

Wyznaczyć  8-mio  bitowy  zapis  U1

liczby 

dziesiętnej 76.



Liczba  76 jest  dodatnia,  zatem  wyznaczamy  jej 

zapis w naturalnym systemie dwójkowym

:

76

(10)

= 1001100

(2)



Otrzymaną liczbę dwójkową  uzupełniamy  bitami 
o wartości 0 do długości formatu otrzymując:

76

(10)

= 01001100

(U1)

background image

Przykład 2

Wyznaczyć  8-mio  bitowy  zapis  U1

liczby 

dziesiętnej (-113).



Liczba  (-113) jest  ujemna.  Jej  moduł  wynosi  113. 
Wyznaczamy 

zapis dwójkowy modułu

:

113

(10)

= 1110001

(2)



Otrzymany zapis uzupełniamy bitami 0 do 
długości 8 bitów. 
Następnie negujemy wszystkie bity i otrzymujemy 
w ten sposób zapis U1 liczby -113:

-113

(10)

= NOT 01110001 = 10001110

(U1)

.

background image

Zakres liczb w zapisie U1



Liczba  U1 przyjmuje  wartość  największą  dla  bitu  znaku 
równego  0  i  pozostałych  bitów  równych  1.  Ponieważ 
pozostałe bity przedstawiają w tym przypadku liczbę n-1 
bitową  w 

naturalnym  kodzie  dwójkowym

,  to  dla  n

bitowego kodu U1 otrzymujemy:

max

(U1)

= 2

n-1

- 1.



Najmniejszą  wartość  liczba  U1 przyjmuje  dla  bitu 
znakowego  równego  1 

(waga  ujemna)

i  pozostałych 

bitów  równych  0.  Ponieważ  w  tym  przypadku  do  wagi 
bitu znakowego nic nie dodajemy, otrzymujemy:

min

(U1)

= -2

n-1

+ 1

background image

Zakres liczb w zapisie U1

Zakres bitowej liczby w kodzie U1 wynosi 

Z

(U1)

= (-2

n-1

+ 1, 2

n-1 

- 1)

Zakres ten jest identyczny z 

zakresem liczb w 

kodzie ZM

.

background image

19

Zapis U2



Zapis U1 posiada kilka niedogodności 
(arytmetyka zmieniamy wagę bitu znakowego z 
(-2

n-1

+ 1)

na (-2

n-1

)

, gdzie oznacza ilość bitów 

w formacie kodu. 



Wagi stają się teraz jednorodne - bit znakowy 
posiada wagę ujemną, lecz o wartości 
bezwzględnej takiej samej jak w 

naturalnym 

kodzie dwójkowym

.



Nowy kod nosi nazwę uzupełnień do podstawy 2 
lub w skrócie U2

(ang. 2C - Two's Complement)

.

background image

Wartość dziesiętna liczby
w zapisie U2

Wartość liczby U2 obliczamy zgodnie z 

poznanymi 

zasadami

- cyfry  mnożymy  przez  wagi  pozycji, 

na  których  się  znajdują  i  dodajemy  otrzymane 
iloczyny. Waga bitu znakowego jest ujemna.

b

n-1

b

n-2

b

n-3

...b

2

b

1

b

0 (U2)

b

n-1

(-2

n-1

)

b

n-2

2

n-2

b

n-3

2

n-3

... + b

2

2

2

b

1

2

1

b

0

2

0

gdzie

b

- bit, cyfra dwójkowa 0 lub 1

n

- liczba bitów w zapisie liczby

background image

Przykład



Najstarszy bit określa znak liczby. Jeśli jest równy 0, liczba jest 

dodatnia i resztę zapisu możemy potraktować jak liczbę w 

naturalnym kodzie dwójkowym

.

01101011(U2) = 64 + 32 + 8 + 2 + 1 = 107(10).



Jeśli bit znaku ustawiony jest na 1, to liczba ma wartość ujemną. Bit 
znaku ma wagę (-2n-1), gdzie n oznacza liczbę bitów w wybranym 

formacie U2. Reszta bitów jest zwykłą liczbą w naturalnym kodzie
dwójkowym. Wagę bitu znakowego i wartość pozostałych bitów 

sumujemy otrzymując wartość liczby U2:



11101011(U2) = (-27) + 64 + 32 + 8 + 2 + 1 = -128 + 107 = (-

21)(10).



Zwróć uwagę, iż postać ujemna liczby U2 nie jest już tak czytelna 

dla nas jak w przypadku kodów ZM (tylko zmiana bitu znaku) i U1 

(negacja wszystkich bitów).

background image

przeliczanie ujemnej liczby dziesiętnej na zapis 
U2 – sposób 1



Liczba  ujemna  musi  mieć  ustawiony  na  1  bit  znaku.  Zatem  nasze 

zadanie  sprowadza  się  do  znalezienia  wartości  pozostałych  bitów.

Bit  znaku stoi  na  pozycji  o  wadze  (-2

n-1

)

,  - ilość  bitów  w  formacie 

U2.  Pozostałe  bity  zapisu  liczby  tworzą  naturalny  od  dwójkowy. 

Wartość  tego  kodu  musi  być  taka,  aby  po  dodaniu  jej  do  wagi 
pozycji  znakowej  otrzymać  wartość  kodowanej  liczby.  Zapiszmy  to 

w formie równania:

kodowana liczba = waga bitu znakowego + wartość kodu pozostałych bitów

kodowana liczba = (-2

n-1

+ wartość kodu pozostałych bitów

stąd

wartość kodu pozostałych bitów = 2

n-1

+ kodowana liczba



Po  wyznaczeniu  wartości  tego  kodu  tworzymy  jego 

zapis  w 

systemie  dwójkowym

,  uzupełniamy  w  miarę  potrzeby  bitem  0  do 

długości  formatu  U2 - 1  i  dodajemy  bit  znakowy  1.  Konwersja  jest 

gotowa

background image

Przykład

Wyznaczyć  8-mio  bitowy  kod  U2 dla  liczby 
dziesiętnej (-45)

(10)

.



Wyznaczamy  moduł  wagi  pozycji  znakowej.  Dla 
= 8, 2

n-1

= 2

7

= 128



wartość kodu pozostałych bitów = 128 + (-45) = 83 = 
1010011

(2)



Dodajemy bit znaku równy 1 i otrzymujemy:

(-45)

(10)

= 11010011

background image

przeliczanie ujemnej liczby dziesiętnej na zapis 
U2 – sposób 2

Jeśli do liczby 2

n

(- ilość bitów w formacie U2) 

dodamy przetwarzaną liczbę dziesiętną, to w 
wyniku otrzymamy wartość kodu dwójkowego 
równoważnego bitowo 

(tzn. o takiej samej 

postaci) 

kodowi U2 przetwarzanej liczby. 

Wynik dodawania wystarczy 

zapisać w postaci 

naturalnego kodu dwójkowego

i konwersja jest 

zakończona.

background image

Przykład

Wyznaczyć  8-mio  bitowy  kod  U2

dla liczby dziesiętnej (-45)

(10)

.



2

8

+  (-45)  =  256  - 45  =  211  = 

11010011

(2)

.



Stąd (-45)

(10)

= 11010011

(U2)

.

background image

Zakres liczb w zapisie U2



Największa  liczba  U2 powstaje  dla  bitu  znaku  równego 
0,  a  pozostałych  bitów  równych  1.  Ponieważ  pozostałe 
bity  przedstawiają  wartość  w  naturalnym  kodzie 
binarnym i jest ich n-1, to



max

(U2)

= 2

n-1

- 1



Z kolei najmniejszą wartość liczby U2 otrzymamy dla bitu 
znaku równego 1, a pozostałych bitów równych 0. W tym 
przypadku  wartość  liczby  jest  równa  wadze  pozycji 
znakowej, czyli



min

(U2)

= (-2

n-1

)

background image

Zakres liczb w zapisie U2



Zakres bitowej liczby w kodzie U2 wynosi

Z

(U2)

= (-2

n-1

, 2

n-1

- 1)



W porównaniu z systemami 

ZM

U1

, zakres liczb U2 jest 

niesymetryczny  - liczb  ujemnych  jest  o  jedną  więcej  niż 
liczb dodatnich