Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek
|
Opisany w poprzednim rozdziale system ZM zapisu liczb ze znakiem był koncepcyjnie prosty, lecz stwarzał poważne problemy przy wykonywaniu operacji arytmetycznych. Z drugiej strony liczba w zapisie ZM nie jest jednorodna. Bit znakowy posiada zupełnie inne znaczenie od pozostałych bitów i nie uczestniczy bezpośrednio w operacjach arytmetycznych.
Drugim podejściem do rozwiązania problemu liczb ze znakiem jest system
uzupełnień do 1 zwany systemem U1 (ang. 1C - One's
Complement). Format liczby U1 jest ustalony z góry - liczba zawiera
określoną ilość bitów. 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ą
Wartości wag pozycji w zapisie U1 | |||||||
---|---|---|---|---|---|---|---|
waga | -2n-1+1 | 2n-2 | 2n-3 | 22 | 21 | 20 | |
cyfra | bn-1 | bn-2 | bn-3 | ... | b2 | b1 | b0 |
Bit znaku przyjmuje wartość 0 dla liczb dodatnich, a dla liczb ujemnych wartość 1 (ponieważ tylko waga tej pozycji jest ujemna, to jest to jedyny sposób na otrzymanie wartości ujemnej).
Zapamiętaj:Wartość liczby U1 obliczamy zgodnie z poznanymi zasadami - cyfry mnożymy przez wagi pozycji, na których się znajdują i dodajemy otrzymane iloczyny:
gdzie: |
4-bitowy system U1 | ||
---|---|---|
Kod U1 | Przeliczenie | Wartość |
0000 | 0 | 0 |
0001 | 20 | 1 |
0010 | 21 | 2 |
0011 | 21 + 20 | 3 |
0100 | 22 | 4 |
0101 | 22 + 20 | 5 |
0110 | 22 + 21 | 6 |
0111 | 22 + 21 + 20 | 7 |
1000 | (-23 + 1) | (-7) |
1001 | (-23 + 1) + 20 | (-6) |
1010 | (-23 + 1) + 21 | (-5) |
1011 | (-23 + 1) + 21 + 20 | (-4) |
1100 | (-23 + 1) + 22 | (-3) |
1101 | (-23 + 1) + 22 + 20 | (-2) |
1110 | (-23 + 1) + 22 + 21 | (-1) |
1111 | (-23 + 1) + 22 + 21 + 20 | 0 |
Ponieważ w systemach binarnych cyfry przyjmują tylko dwie wartości 0 lub 1, można rachunek znacznie uprościć sumując jedynie te wagi, dla których cyfra zapisu liczby ma wartość 1.
W tabelce powyżej przedstawiliśmy wszystkie możliwe do utworzenia liczby w 4-bitowym kodzie U1. Zwróć uwagę, iż wartość 0 posiada dwa słowa kodowe: 0000 oraz 1111. Wynika to bezpośrednio ze wzoru obliczania wartości liczby U1. Jeśli wszystkie cyfry mają wartość 0, to żadna waga pozycji nie uczestniczy w wartości liczby i wartość ta jest równa 0.
Z kolei jeśli bit znaku jest równy
1, to jego waga wlicza się do
wartości liczby. Waga bitu znakowego jest równa
waga b3 = (-23+1) = -7 |
Jeśli pozostałe bity liczby są ustawione na 1, to ich wagi sumują się do wartości 7. Jeśli teraz dodamy wagę bitu znakowego i wagi pozostałych bitów, otrzymamy wartość 0.
Drugą charakterystyczną cechą kodu U1 są liczby przeciwne. Zwróć uwagę, iż liczba przeciwna zawsze powstaje w kodzie U1 przez negację wszystkich bitów:
1(10) = 0001(U1)
: (-1)(10) = 1110(U1) 5(10) = 0101(U1) : (-5)(10) = 1010(U1) 7(10) = 0111(U1) : (-7)(10) = 1000(U1) |
Zasada ta obowiązuje dla kodów U1 o dowolnej długości.
Jeśli liczba jest dodatnia, to najstarszy bit znakowy posiada wartość 0. Pozostałe bity służą do zapisu liczby w naturalnym kodzie binarnym:
0111(U1) = 7(10), 0001(U1) = 1(10), 01111111(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:
1101(U1)
= (-2)(10) : moduł 2(10) = 010(2)
: NOT 010 = 101 1100(U1) = (-3)(10) : moduł 3(10) = 011(2) : NOT 011 = 100 1010(U1) = (-5)(10) : moduł 5(10) = 101(2) : NOT 101 = 010 |
Wynika stąd prosta metoda przeliczania liczby dziesiętnej na zapis U1.
Zapamiętaj:Metoda 1 - procedura wyznaczania zapisu U1 dla liczby dziesiętnej
|
Przykład:
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). |
Przykład:
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). |
Zapamiętaj:Metoda 2 - procedura wyznaczania zapisu U1 dla liczby dziesiętnej
|
Przykład:
Wyznaczyć 8-mio bitowy zapis U1 liczby dziesiętnej (-113).
Obliczamy:
28 - 1 - 113 = 256 - 1 - 113 = 142 |
Otrzymany wynik kodujemy w systemie dwójkowym i otrzymujemy kod U1 liczby -113:
142(10) = 10001110(2), czyli (-113)(10) = 10001110(U1). |
Przykład:
Wyznaczyć 16 bitowy zapis U1 liczby dziesiętnej (-4521).
Obliczamy:
216 - 1 - 4521 = 65536 - 1 - 4521 = 61014 |
Otrzymany wynik kodujemy w systemie dwójkowym i otrzymujemy kod U1 liczby -4521:
61014(10) = 1110111001010110(2), czyli (-4521)(10) = 1110111001010110(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ę
max(U1) = 2n-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:
216 - 1 - 4521 = 65536 - 1 - 4521 = 61014 |
min(U1) = -2n-1 + 1 |
i ostatecznie:
Zapamiętaj:Zakres n bitowej liczby w kodzie U1 wynosi:
Zakres ten jest identyczny z zakresem liczb w kodzie ZM. |
Przykład:
4-bitowe liczby U1 posiadają zakres:
od | -23 + 1 | = | -7 | = 1000(ZM) |
do | 23 - 1 | = | 7 | = 0111(ZM1) |
8-bitowe liczby U1 posiadają zakres:
od | -27 + 1 | = | -127 | = 10000000(ZM) |
do | 27 - 1 | = | 127 | = 01111111(ZM1) |
16 bitowe liczby U1 posiadają zakres:
od | -215 + 1 | = | -32767 | = 1000000000000000(ZM) |
do | 215 - 1 | = | 32767 | = 0111111111111111(ZM1) |
Kod U1 może również reprezentować liczby ułamkowe, jeśli dokonamy rozszerzenia cyfr na pozycje ułamkowe. W przypadku liczb dodatnich (gdy pozycja znakowa zawiera cyfrę 0) stosujemy poznane zasady wyznaczania wartości liczby.
Przykład:
0111,1101(U1)
= 22 + 21 + 20 + 2-1 + 2-2
+ 2-4 0111,1101(U1) = 4 + 2 + 1 + 1/2 + 1/4 + 1/16 0111,1101(U1) = 713/16 |
Jednakże przy liczbach ujemnych musimy wprowadzić drobną modyfikację w stosunku do liczb całkowitych. Kod uzupełnień do 1 ma taką własność, iż wyraz kodowy zbudowany z samych jedynek jest zawsze równy 0:
111...111 | , | 111...111 | = 0 |
n bitów |
m bitów |
Wynika z tego, iż suma wszystkich wag liczby musi sprowadzać się do 0. Zatem waga bitu znakowego spełnia równanie:
wagaznakowa U1 = -(maxczęści całkowitej + maxczęści ułamkowej) |
Załóżmy, iż nasz format U1 zbudowany jest z n bitów całkowitych i m bitów ułamkowych (zobacz tutaj).
maxczęści całkowitej = 2n-1
- 1 maxczęści ułamkowej = (2m - 1) / 2m |
Stąd
wagaznakowa U1 = -(2n-1 - 1 + (2m - 1) / 2m) |
gdy m = 0, wzór redukuje się do podanego wcześniej wzoru -2n-1 + 1 dla liczb całkowitych.
Przykład:
1011,1011(U1) : n = 4; m = 4, zatem waga znakowa jest równa -(23 - 1 + (24 - 1) / 24) = -715/16 |
1011,1011(U1) = -715/16 + 3
+ 11/16 1011,1011(U1) = -44/16 |
Liczby U1 dodajemy zgodnie z poznanymi zasadami dodawania dwójkowego. Jednakże jeśli występuje przeniesienie poza bit znaku, to do wyniku należy dodać 1, aby otrzymać poprawny rezultat dodawania.
Przykład:
3 + 2
|
3 + (-5)
|
(-4) + 3
|
W podanych powyżej trzech przykładach przeniesienie poza bit znaku nie występuje, zatem wyniki operacji dodawania nie wymagają korekty i są poprawne.
2 + (-1)
|
(-1) + (-1)
|
(-3) + 7
|
Tutaj natomiast obserwujemy sytuację, gdy pojawia się przeniesienie poza bit znakowy (zapisaliśmy je w kolorze niebieskim). W takim przypadku wynik jest o 1 za mały i wymaga korekty. Ponieważ przeniesienie łatwo wykryć a układy zwiększające liczbę binarną o 1 są nieskomplikowane, dodawanie w kodzie U1 jest dosyć prosto realizowalne sprzętowo.
Liczby U1 mogą być liczbami stałoprzecinkowymi. W przypadku dodawania takich liczb przeniesienie poza bit znaku dodawane jest do najmłodszej cyfry wyniku.
Przykład:
2
3/16 + (-3/16)
|
Odejmowanie realizujemy za pomocą dodawania liczby przeciwnej. Liczbę przeciwną tworzymy w kodzie U1 negując wszystkie bity zapisu liczby.
Przykład:
5 - 6
|
operację 5 - 6 zastępujemy operacją 5 + (-6) |
5 + (-6)
|
Zapamiętaj:Przy dodawaniu dwóch liczb U1 może wystąpić nadmiar (niedomiar), gdy wynik dodawania nie mieści się w ustalonej formatem ilości bitów. Nadmiar (niedomiar) występuje tylko w przypadku dodawania liczb tego samego znaku (czy potrafisz to uzasadnić?) . Zatem najprostszą metodą wykrycia nadmiaru (niedomiaru) jest sprawdzenie znaku wyniku. Jeśli znak wyniku operacji różni się od znaku argumentów, to wystąpił nadmiar (niedomiar).
|
Oblicz wartość dziesiętną podanych liczb w kodzie U1:
Przelicz podane liczby dziesiętne na ich zapis w 8-mio bitowym kodzie U1:
Wykonaj podane działania arytmetyczne na liczbach w kodzie U1:
Zobacz dalej...
Zapis znak-moduł - ZM | Zapis uzupełnień do 2 - U2 | Zapis dwójkowy z nadmiarem | Podsumowanie systemów dwójkowych
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.