[ Pobierz całość w formacie PDF ]
Czym jest ów kod uzupełnienia do dwóch zwany również
krócej kodem uzupełnieniowym? Jego zasadę można poglądowo wy-
jaśnić na przykładzie licznika magnetofonu. Powiedzmy, że
trzycyfrowy licznik wskazuje "000" i cofniemy go o jedną po-
zycję wstecz. Wskaże wówczas "999". Będzie to niejako wynik
odjęcia 1 od 0 czyli -1.
Podobnie tworzy się liczby binarne w kodzie uzupełnienia
do dwóch. Jeżeli z "00000000" cofniemy nasz "licznik binarny"
o 1, wskaże "11111111". Jest to właśnie odpowiednik -1 w ko-
dzie uzupełnieniowym. Reprezentacją -2 będzie binarne
11111110 itd.
Jak zmienić znak liczby, powiedzmy +57 czyli binarnie
00111001? Najpierw odejmujemy ją od 100000000, co jest równo-
znaczne z zamianą wszystkich zer na jedynki, a jedynek na ze-
ra. Nazywamy to i n w e r s j ą bitów. Powstająca liczba
--- 56 ---
nosi nazwę uzupełnienia do 1. Drugi krok - to dodanie 1. W
ten sposób powstaje uzupełnienie do 2. Wykonajmy te czynnoś-
ci na naszej liczbie:
Wartość początkowa 00111001
Uzupełnienie do 1 11000110
Uzupełnienie do 2 11000111
Aatwo ustalić, że w kodzie uzupełnienia do 2 każdą liczbę
o wartości -A reprezentuje 256-A.
Tablica na rysunku 3.2 przedstawia przykładowe liczby
binarne w kodzie uzupełnieniowym oraz ich wartości bez znaku
w dec i hex.
Liczba ze znakiem Bin Hex Dec
-5 11111011 FB 251
-4 11111100 FC 252
-3 11111101 FD 253
-2 11111110 FE 254
-1 11111111 FF 255
0 00000000 00 0
1 00000001 01 1
2 00000010 02 2
3 00000011 03 3
4 00000100 04 4
5 00000101 05 5
Rys. 3.2 Liczby ze znakiem w kodzie uzupełnieniowym
Z tablicy wynika, że tę samą liczbę binarną mieszczącą
się w bajcie można odczytać na dwa sposoby: jako liczbę bez
znaku lub ze znakiem. W pierwszym przypadku zmieszczą się w
bajcie liczby od 0 do 255, w drugim natomiast - z zakresu od
-128 do +127. Różnica wartości powstaje przy tym dopiero powy-
żej 127, czyli od chwili, gdy najwyższy bit w bajcie przybie-
rze wartość 1. Toteż w liczbach ze znakiem bit ten ma charak-
ter bitu znaku: gdy ma wartość 0, liczba jest dodatnia, gdy 1
- ujemna. Po każdym działaniu arytmetycznym 6502 sprawdza war-
tość tego bitu w uzyskanym wyniku i identyczną przypisuje zna-
cznikowi N w rejestrze P, znacznikowi wyniku ujemnego. Gdy
posługujemy się arytmetyką ze znakiem, właśnie sprawdzenie
--- 57 ---
znacznika N pozwala ustalić, czy uzyskany wynik jest dodatni,
czy ujemny.
Powstaje jednak istotny problem: liczba ze znakiem jest
jakby krótsza o najwyższy bit i przy dodawaniu przeniesienie
powstaje o jeden bit niżej. Dlatego właśnie w rejestrze zna-
czników istnieje jeszcze jeden bit sygnalizujący takie prze-
niesienie, które nosi nazwę n a d m i a r u. Z angielskiego
słowa overflow wzięto dla nazwania tego znacznika drugą lite-
rę V, ponieważ O przypomina zero.
Znacznik V istotny jest tylko przy dodawaniu i odejmowa-
niu liczb ze znakiem. Spełnia wówczas ważną rolę w uzyskaniu
poprawnego wyniku, sygnalizując przeniesienie z bitu b6 do b7.
Dochodzimy do niezwykle istotnej zalety kodu uzupełnie-
niowego. Oto dzięki niemu operacje na takich samych liczbach
binarnych dają poprawne wyniki zarówno wtedy, gdy traktujemy
je jako liczby bez znaku, jak i wtedy, gdy interpretujemy je
jako liczby ze znakiem. Wymaga to jednak nieco odmiennego prze-
prowadzania obliczeń.
3.7 Przeniesienie, nadmiar i pożyczka.
Rozpatrzmy przykłady dodawania ujawniające specyficzne
właściwości kodu uzupełnieniowego. Wykonując dodawanie rozma-
itych liczb notować będziemy stany znaczników C i V oraz wy-
niki dodawania liczb bez znaku i ze znakiem, a w tym ostatnim
przypadku zbadamy również poprawność wyników.
Rozróżnić można trzy rodzaje sytuacji. Pierwsza polega na
dodawaniu stosunkowo niedużych liczb, przy czym wynik nie po-
woduje ani przeniesienia, ani nadmiaru:
00000111 +7
+ 00001100 +12_
00010011 +19 C=0 V=0
00000010 +2
+ 11111100 -4_
11111110 -2 C=0 V=0
Jest to sytuacja, w której wynik jest poprawny identycz-
nie jak przy dodawaniu.
Sytuacja druga polega na dodawaniu stosunkowo niedużych
liczb, przy których powstaje przeniesienie do 9 bitu, ale nie
--- 58 ---
powstaje nadmiar.
00000100 +4
+ 11111110 -2_
1 00000010 +2 C=1 V=0
11111110 -2
+ 11111100 -4_
1 11111010 -6 C=1 V=0
Wynik jest poprawny pod warunkiem, że pominiemy przenie-
sienie.
Sytuacja trzecia polega na dodawaniu dwóch liczb dodat-
nich dających sumę większą niż 127, co powoduje nadmiar, a ta-
kże dwóch liczb ujemnych dających sumę mniejszą niż 128, co
również powoduje nadmiar.
01111111 +127
+ 00000001 +1_
10000000 -128 C=0 V=1 Wynik niepoprawny
10000001 -127
+ 11001110 -50_
1 01001111 +79 C=1 V=1 Wynik niepoprawny
Ustalmy na tej podstawie zasady postępowania przy dodawa-
niu liczb ze znakiem:
- inaczej postępujemy z bitem przeniesienia zawsze go ig-
norując:
- bit nadmiaru V sygnalizuje konieczność skorygowania wy-
niku. Jak się to czyni, rozpatrzymy pózniej przy omó-
wieniu znacznika V oraz wykorzystujących go rozkazów
rozgałęzień warunkowych BVC i BVS.
Pewna zawiłość działań na liczbach ze znakiem skłania wie-
lu programistów do ich unikania, gdy jest to możliwe, i posłu-
giwania się mniej "niebezpieczną" arytmetyką bez znaku. Np.
Mansfield [2] ocenia wręcz rozkazy BVC, BVS i CLV jako niep-
rzydatne.
wiczenia
x 1. Wykonajmy dodawanie poniższych par liczb binarnych
ze znakiem, podając obok wartości składników i sum w dec oraz
odpowiedzmy, które dodawania dają błędny wynik.
a/ 10100000 b/ 10000001 c/ 01111111
+01100001 +11111100 +00000100
--- 59 ---
2. Czy może wystąpić nadmiar przy dodawaniu 8-bitowej
liczby dodatniej i 8-bitowej ujemnej? Dlaczego?
3.8 Odejmowanie liczb 8 i 16-bitowych z pomocą SBC [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl rafalstec.xlx.pl
Czym jest ów kod uzupełnienia do dwóch zwany również
krócej kodem uzupełnieniowym? Jego zasadę można poglądowo wy-
jaśnić na przykładzie licznika magnetofonu. Powiedzmy, że
trzycyfrowy licznik wskazuje "000" i cofniemy go o jedną po-
zycję wstecz. Wskaże wówczas "999". Będzie to niejako wynik
odjęcia 1 od 0 czyli -1.
Podobnie tworzy się liczby binarne w kodzie uzupełnienia
do dwóch. Jeżeli z "00000000" cofniemy nasz "licznik binarny"
o 1, wskaże "11111111". Jest to właśnie odpowiednik -1 w ko-
dzie uzupełnieniowym. Reprezentacją -2 będzie binarne
11111110 itd.
Jak zmienić znak liczby, powiedzmy +57 czyli binarnie
00111001? Najpierw odejmujemy ją od 100000000, co jest równo-
znaczne z zamianą wszystkich zer na jedynki, a jedynek na ze-
ra. Nazywamy to i n w e r s j ą bitów. Powstająca liczba
--- 56 ---
nosi nazwę uzupełnienia do 1. Drugi krok - to dodanie 1. W
ten sposób powstaje uzupełnienie do 2. Wykonajmy te czynnoś-
ci na naszej liczbie:
Wartość początkowa 00111001
Uzupełnienie do 1 11000110
Uzupełnienie do 2 11000111
Aatwo ustalić, że w kodzie uzupełnienia do 2 każdą liczbę
o wartości -A reprezentuje 256-A.
Tablica na rysunku 3.2 przedstawia przykładowe liczby
binarne w kodzie uzupełnieniowym oraz ich wartości bez znaku
w dec i hex.
Liczba ze znakiem Bin Hex Dec
-5 11111011 FB 251
-4 11111100 FC 252
-3 11111101 FD 253
-2 11111110 FE 254
-1 11111111 FF 255
0 00000000 00 0
1 00000001 01 1
2 00000010 02 2
3 00000011 03 3
4 00000100 04 4
5 00000101 05 5
Rys. 3.2 Liczby ze znakiem w kodzie uzupełnieniowym
Z tablicy wynika, że tę samą liczbę binarną mieszczącą
się w bajcie można odczytać na dwa sposoby: jako liczbę bez
znaku lub ze znakiem. W pierwszym przypadku zmieszczą się w
bajcie liczby od 0 do 255, w drugim natomiast - z zakresu od
-128 do +127. Różnica wartości powstaje przy tym dopiero powy-
żej 127, czyli od chwili, gdy najwyższy bit w bajcie przybie-
rze wartość 1. Toteż w liczbach ze znakiem bit ten ma charak-
ter bitu znaku: gdy ma wartość 0, liczba jest dodatnia, gdy 1
- ujemna. Po każdym działaniu arytmetycznym 6502 sprawdza war-
tość tego bitu w uzyskanym wyniku i identyczną przypisuje zna-
cznikowi N w rejestrze P, znacznikowi wyniku ujemnego. Gdy
posługujemy się arytmetyką ze znakiem, właśnie sprawdzenie
--- 57 ---
znacznika N pozwala ustalić, czy uzyskany wynik jest dodatni,
czy ujemny.
Powstaje jednak istotny problem: liczba ze znakiem jest
jakby krótsza o najwyższy bit i przy dodawaniu przeniesienie
powstaje o jeden bit niżej. Dlatego właśnie w rejestrze zna-
czników istnieje jeszcze jeden bit sygnalizujący takie prze-
niesienie, które nosi nazwę n a d m i a r u. Z angielskiego
słowa overflow wzięto dla nazwania tego znacznika drugą lite-
rę V, ponieważ O przypomina zero.
Znacznik V istotny jest tylko przy dodawaniu i odejmowa-
niu liczb ze znakiem. Spełnia wówczas ważną rolę w uzyskaniu
poprawnego wyniku, sygnalizując przeniesienie z bitu b6 do b7.
Dochodzimy do niezwykle istotnej zalety kodu uzupełnie-
niowego. Oto dzięki niemu operacje na takich samych liczbach
binarnych dają poprawne wyniki zarówno wtedy, gdy traktujemy
je jako liczby bez znaku, jak i wtedy, gdy interpretujemy je
jako liczby ze znakiem. Wymaga to jednak nieco odmiennego prze-
prowadzania obliczeń.
3.7 Przeniesienie, nadmiar i pożyczka.
Rozpatrzmy przykłady dodawania ujawniające specyficzne
właściwości kodu uzupełnieniowego. Wykonując dodawanie rozma-
itych liczb notować będziemy stany znaczników C i V oraz wy-
niki dodawania liczb bez znaku i ze znakiem, a w tym ostatnim
przypadku zbadamy również poprawność wyników.
Rozróżnić można trzy rodzaje sytuacji. Pierwsza polega na
dodawaniu stosunkowo niedużych liczb, przy czym wynik nie po-
woduje ani przeniesienia, ani nadmiaru:
00000111 +7
+ 00001100 +12_
00010011 +19 C=0 V=0
00000010 +2
+ 11111100 -4_
11111110 -2 C=0 V=0
Jest to sytuacja, w której wynik jest poprawny identycz-
nie jak przy dodawaniu.
Sytuacja druga polega na dodawaniu stosunkowo niedużych
liczb, przy których powstaje przeniesienie do 9 bitu, ale nie
--- 58 ---
powstaje nadmiar.
00000100 +4
+ 11111110 -2_
1 00000010 +2 C=1 V=0
11111110 -2
+ 11111100 -4_
1 11111010 -6 C=1 V=0
Wynik jest poprawny pod warunkiem, że pominiemy przenie-
sienie.
Sytuacja trzecia polega na dodawaniu dwóch liczb dodat-
nich dających sumę większą niż 127, co powoduje nadmiar, a ta-
kże dwóch liczb ujemnych dających sumę mniejszą niż 128, co
również powoduje nadmiar.
01111111 +127
+ 00000001 +1_
10000000 -128 C=0 V=1 Wynik niepoprawny
10000001 -127
+ 11001110 -50_
1 01001111 +79 C=1 V=1 Wynik niepoprawny
Ustalmy na tej podstawie zasady postępowania przy dodawa-
niu liczb ze znakiem:
- inaczej postępujemy z bitem przeniesienia zawsze go ig-
norując:
- bit nadmiaru V sygnalizuje konieczność skorygowania wy-
niku. Jak się to czyni, rozpatrzymy pózniej przy omó-
wieniu znacznika V oraz wykorzystujących go rozkazów
rozgałęzień warunkowych BVC i BVS.
Pewna zawiłość działań na liczbach ze znakiem skłania wie-
lu programistów do ich unikania, gdy jest to możliwe, i posłu-
giwania się mniej "niebezpieczną" arytmetyką bez znaku. Np.
Mansfield [2] ocenia wręcz rozkazy BVC, BVS i CLV jako niep-
rzydatne.
wiczenia
x 1. Wykonajmy dodawanie poniższych par liczb binarnych
ze znakiem, podając obok wartości składników i sum w dec oraz
odpowiedzmy, które dodawania dają błędny wynik.
a/ 10100000 b/ 10000001 c/ 01111111
+01100001 +11111100 +00000100
--- 59 ---
2. Czy może wystąpić nadmiar przy dodawaniu 8-bitowej
liczby dodatniej i 8-bitowej ujemnej? Dlaczego?
3.8 Odejmowanie liczb 8 i 16-bitowych z pomocą SBC [ Pobierz całość w formacie PDF ]