background image

 

 

Zapis liczb binarnych ze 

znakiem

background image

 

 

Dotychczas opisany sposób kodowania 

dwójkowego umożliwia przedstawianie liczb 
dodatnich i zera. Z drugiej strony wiemy, jak 
ważne w zastosowaniach są liczby ujemne. W 
systemie dziesiętnym sprawę rozwiązaliśmy 
przez wprowadzenie znaku przed zapisem cyfr 
liczby. Jeśli liczby chcemy przetwarzać za 
pomocą komputera, to mamy do dyspozycji 
jedynie bity o wartościach 0 lub 1. Bity mogą 
kodować cyfry dwójkowe, ale brakuje tutaj 
wartości dla znaku '+' lub '-'.

Niestety musimy odejść nieco od naturalnego 

systemu dwójkowego i wprowadzić kilka 
dodatkowych ustaleń. 

background image

 

 

• Kodowanie liczb dodatnich i ujemnych opiera się 

na stałym formacie zapisu liczby. Oznacza to, iż 
z góry ustala się liczbę cyfr używanych do 
zapisu wartości, np. 8, 16, 24, 32, ... Jeśli 
wybierzemy jeden format, to musimy się go 
ściśle trzymać.

• Najstarsza cyfra dwójkowa (bit) ma inne 

znaczenie niż reszta cyfr i pełni funkcję bitu 
znaku. Jeśli bit ten ma wartość 0, to liczba jest 
dodatnia. Jeśli ma wartość 1, to liczba jest 
ujemna. W ten sposób kodujemy nasze znaki + i 
-.

Istnieją dwa główne sposoby kodowania liczb ze 

znakiem - kod ZNAK-MODUŁ, kod U2

background image

 

 

Znak-Moduł

W systemie tym stosujemy bardzo prostą metodę 

kodowania liczb ze znakiem. Najstarszy bit liczby jest 
bitem znaku. Reszta bitów określa wartość bezwzględną 
(moduł) liczby: Jeśli przyjmiemy do zapisu liczb format 
całkowity n-bitowy, to liczby w kodzie znak-moduł mają 
następującą postać:
znak

   moduł

a

n-1

a

n-2

 ... a

1

a

0

Wartość n-bitowej, całkowitej liczby w dwójkowym kodzie 

znak-moduł obliczamy wg wzoru:             

n-2

a

n-1

a

n-2

 ... a

1

a

0

 = (1 - 2 * a

n-1

)  * 

Σ

 a

i

 * 2

i

     

i=0

background image

 

 

Wyrażenie (1 - 2 x bit znaku) przyjmuje 

odpowiednio wartość 1, gdy bit znaku jest 
równy 0, a  -1, gdy bit znaku ma wartość 1
czyli określa liczbę ujemną. W dalszej części 
wzoru mamy obliczanie wartości pozostałych 
bitów, czyli modułu. Moduł jest przemnażany 
przez wyrażenie znakowe i w efekcie 
otrzymujemy wartość dodatnią lub ujemną w 
zależności od stanu bitu znaku. 

background image

 

 

Przykład 1:

n = 4 bity

• 0110

ZM

 = (1 - 2 * 0) * (0 * 2

0

 + 1 * 2

1

 + 1 * 2

2

)

0110

ZM

 = (1 - 2 * 0) * (0 * 1 + 1 * 2 + 1 * 4)

0110

ZM

 = 1 * ( 2 + 4)

0110

ZM

 = 6

D

• 1011

ZM

 = (1 - 2 * 1) * (1 * 2

0

 + 1 * 2

1

 + 0 * 2

2

)

1011

ZM

 = (1 - 2 * 1) * (1 * 1 + 1 * 2 + 0 * 4)

1011

ZM

 = -1 * (1 + 2)

1011

ZM

 = -3

D

background image

 

 

Przykład 2:
Przedstawić wartość -69 w 8-bitowym kodzie znak-

moduł.

1. Znajdujemy przedstawienie dwójkowe modułu

69 / 2 = 34 i reszta 1
34 /2 = 17 i reszta 0
17 / 2 = 8 i reszta 1
8 / 2  = 4 i reszta 0
4 / 2 = 2 i reszta 0
2 / 2 = 1 i reszta 0
1 / 2 = 0 i reszta 1
69

D

 = 1000101

B

2. Otrzymaną liczbę dwójkową uzupełniamy bitem 

znaku i otrzymujemy:
-69

D

 = 11000101

ZM

background image

 

 

Zakres n-bitowych liczb w kodzie ZM
Zakres liczb ZM wynika bezpośrednio ze wzoru 

obliczeniowego. Wartość maksymalną otrzymamy 
przy znaku dodatnim i maksymalnym module. Wartość 
minimalną
 otrzymamy przy znaku ujemnym i również 
maksymalnym module. Ponieważ moduł jest o jeden bit 
mniejszy niż wynosi długość liczby Z-M, to:

max

ZM

 = 2

n-1

 - 1,  min

ZM

 = -2

n-1

 + 1

dla n=8 -> max

ZM

 = 127,  min

ZM

 = -127

W kodzie ZM można na dwa sposoby zapisać wartość 0

raz z bitem znaku 0, i raz z bitem znaku 1, np. dla n=4:
0000

ZM

 = 0 (zero dodatnie)

1000

ZM

 = 0 (zero ujemne, ale też zero)

background image

 

 

U2

Wniosek z zapisu liczb w kodzie ZM jest pesymistyczny. 

Wymyśliliśmy sposób kodowania liczb ze znakiem, 
który sprawia kłopoty przy obliczeniach. Nie może 
być inaczej, ponieważ bit znaku jest sztucznie 
dołączony do reszty bitów tworzących wartość liczby.

Wykonywanie podstawowych działań arytmetycznych 

na liczbach prowadzący do poprawnych wyników jest 
możliwe dzięki Kodowi Uzupełnień do 2 (lub 
Uzupełnień do Podstawy), w skrócie U2. Budowa 
liczby w kodzie U2 jest podobna do kodu znak-moduł. 
Jednak teraz pozycja znakowa (najstarszy bit) 
posiada swoją wagę i uczestniczy w wartości liczby 
jak każda inna pozycja.

background image

 

 

Waga pozycji znakowej jest ujemna:

znak moduł
a

n-1

a

n-2

 ... a

1

a

0

-2

n-1

2

n-2

 ... 2

1

2

0

Wartość n-bitowej liczby zapisanej w kodzie U2 

obliczamy w standardowy sposób: sumując kolejne 
iloczyny cyfr przez wagi pozycji.

 

                   

n-2

a

n-1

a

n-2

 ... a

1

a

0

 = a

n-1 

*

 

(- 2

n-1

 )  + 

Σ

 a

i

 * 2

i

       

i=0

background image

 

 

Przykład:

n = 4 bity

• 0110

U2

 = 0 * (-2

3

) + 0 * 2

0

 + 1 * 2

1

 + 1 * 2

2

0110

U2

 = 0 * (-8) + 0 * 1 + 1 * 2 + 1 * 4

0110

U2

 = 2 + 4

0110

U2

 = 6

D

• 1110

U2

 = 1 * (-2

3

) + 0 * 2

0

 + 1 * 2

1

 + 1 * 2

2

1110

U2

 = 1 * (-8) + 0 * 1 + 1 * 2 + 1 * 4

1110

U2

 = -8 + 2 + 4

1110

U2

 = -2

background image

 

 

Zapis liczb ujemnych
Musimy rozpatrzyć dwa przypadki:
1. Liczba jest dodatnia - znajdujemy jej przedstawienie 

binarne i uzupełniamy zerami do przyjętego formatu. 
Na przykład przyjmijmy format 4-bitowy i zapiszmy 
w nim wartość 3:

3

D

 = 11

B

Ponieważ format ma 4 bity, to dodajemy na początku 
dwie cyfry 0 i otrzymujemy liczbę dodatnią w kodzie 
U2:

3

D

 = 0011

B

background image

 

 

2. Liczba jest ujemna. W tym przypadku bit znaku musi 

mieć wartość 1. Ponieważ stoi on na pozycji o wadze 
-2

n-1

, a reszta liczby jest dodawana do tej wagi, to 

musimy znaleźć taką wartość, która dodana do wagi 
bitu znaku da nam liczbę kodowaną. Wartość tę 
kodujemy na pozostałych bitach. Np. zakodujmy 
liczbę -3 w 4-bitowym kodzie U2. Bit znaku ma 
wartość -2

3

, czyli -8. Aby otrzymać -3, do -8 musimy 

dodać liczbę 5 i tę wartość kodujemy na pozostałych 
bitach:

-8 + 5 = -3

1101

U2

 = -3

D

background image

 

 

Możemy również znaleźć przedstawienie modułu tej 

liczby, a następnie wyliczyć wartość przeciwną w 
kodzie U2 wg przepisu:

1. Aby znaleźć wartość przeciwną w kodzie U2 należy 

wykonać następujące czynności: zamienić 
wszystkie bity liczby na przeciwne, tzn. 1 na 0 i 0 
na 1 

2. Do tak otrzymanej liczby dodać wartość 1 

background image

 

 

Czyli w naszym przykładzie najpierw znajdujemy zapis 

dwójkowy liczby 3:

3

D

 = 11

B

Następnie uzupełniamy cyfry do 4 bitów:     3

D

 = 0011

U2

Teraz postępujemy zgodnie z opisaną metodą: 

zamieniamy bity na przeciwne i dodajemy 1

   0011

U2

 = 3

D

   1100
+ 0001
  1101

U2

 = -3

D

Otrzymaliśmy identyczną liczbę, jak poprzednio.

background image

 

 

Zakres n-bitowych liczb w kodzie U2
Największą wartość otrzymamy, gdy bit znaku ma stan 0

a reszta bitów liczby ma stan 1. Ponieważ dla n-
bitowego formatu U2 bitych o wartości 1 jest n-1, to

max

U2 n-bitów

 = 2

n-1

 - 1

A więc tyle samo co w kodzie ZM. Najmniejszą wartość 

ujemną otrzymamy, gdy bit znaku przyjmie stan 1, a 
reszta bitów będzie miała stan 0 - najmniejszą wartością 
liczby w kodzie U2 jest waga pozycji znakowej.

min

U2 n-bitów

 = -2

n-1

Dla n = 8 otrzymamy: max

U2 8b

 = 127min

U2 8b

 = -128

Zwróćcie uwagę, iż górna i dolna granica liczb są 

niesymetryczne. W kodzie U2 każda kombinacja kodowa 
odpowiada dokładnie jednej liczbie - zero nie powtarza 
się, jak w kodzie Z-M. Jest to więc kod efektywny.


Document Outline