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 |
©2024 mgr Jerzy Wałaszek |
Dane komputer składuje w pamięci (ang. memory), czyli urządzeniu przechowującym bity. Pamięć jest podzielona na komórki (ang. cells), do których ma dostęp procesor komputera. W każdej komórce można przechować 8 bitów informacji:
Postąpiono tak z powodów ekonomicznych – bit jest bardzo małą jednostką informacji. 8 bitów tworzy bajt (ang. byte). Jeśli w bajcie zapiszemy liczbę NBS, to poszczególne bity będą miały wagi:
Waga: |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Bit: |
b7
|
b6
|
b5
|
b4
|
b3
|
b2
|
b1
|
b0
|
Powyższa tabelka pozwala nam w prosty sposób wyliczać wartość jednobajtowej liczby NBS (sumujemy wagi tych bitów, które mają wartość 1):
|
= 128 + 64 + 4 + 2 + 1
= 199(10) |
|
= 32 + 16 + 8
= 56(10) |
Tutaj musimy wyliczać wagi pozycji, co przy większej liczbie bitów jest niewygodne. Dlatego częściej stosujemy tzw. schemat Hornera. Algorytm jest następujący:
wejście: ciąg cyfr dwójkowych reprezentujący liczbę
dwójkową NBS
wyjście: W = wartość liczby
Lista kroków:
K01: W ← 0 K02: Dopóki są nieprzetworzone cyfry liczby, wykonuj kroki K03...K04 K03: c ← kolejna cyfra liczby K04: W ← W + W + c K05: Pisz W K06: Zakończ
Pseudokod:
W ← 0 dopóki istnieją nieprzetworzone cyfry, wykonuj: czytaj kolejną cyfrę do c W ← W + W + c wypisz W
Schemat blokowy:
Z powyższego algorytmu korzysta się w programach, dlatego warto go zapamiętać. Zobaczmy, jak on działa:
L(2) = 10111101
|
|
|
W = 0 |
Bierzemy kolejne cyfry liczby: | |
10111101
|
W = 2 × 0 + 1 = 1
|
10111101
|
W = 2 × 1 + 0 = 2
|
10111101
|
W = 2 × 2 + 1 = 5
|
10111101
|
W = 2 × 5 + 1 = 11
|
10111101
|
W = 2 × 11 + 1 = 23
|
10111101
|
W = 2 × 23 + 1 = 47
|
10111101
|
W = 2 × 47 + 0 = 94
|
10111101
|
W = 2 × 94 + 1 = 189
|
10111101 |
Koniec cyfr, W = 189 |
Dla wprawy oblicz tym algorytmem wartości liczb dwójkowych NBS:
10101010(2) = ? 11100001(2) = ? 1110001110111111(2) = ?
Ilość bitów liczby nie ma tutaj znaczenia.
Rozwiążmy teraz następujący problem. Mamy n-bitową liczbę dwójkową w kodzie NBS. Jaki jest zakres wartości, które ta liczba może reprezentować?
Najmniejsza wartość jest bardzo prosta, ponieważ wszystkie bity liczby muszą być zerami (dlaczego?), zatem
A największa? Skorzystajmy ze wzoru na wartość liczby NBS:
bn-1bn-2...b2b1b0 = bn-12n-1 + bn-22n-2 + ... + b222 + b121 + b020
Aby suma ta była największa, muszą w niej wystąpić wszystkie wagi pozycji, a to oznacza, iż wszystkie bity muszą być jedynkami (dlaczego?), zatem
Tutaj nie jest tak prosto jak z zerami. Ile wynosi wartość n-bitowej liczby NBS, której wszystkie bity są jedynkami? Zróbmy to tak:
n = 1 |
Lmax = 1(2) = 1 |
n = 2 |
Lmax = 11(2) = 3 |
n = 3 |
Lmax = 111(2) = 7 |
n = 4 |
Lmax = 1111(2) = 15 |
... |
... |
Widzisz już prawidłowość? Zwróć uwagę, iż otrzymane liczby, to wartości następnej wagi pozycji przed najstarszą cyfrą minus 1:
n = 1 |
Lmax = 211(2) |
= |
1 = |
2 - 1 |
n = 2 |
Lmax = 41211(2) |
= |
3 = |
4 - 1 |
n = 3 |
Lmax = 8141211(2) |
= |
7 = |
8 - 1 |
n = 4 |
Lmax = 1618141211(2) |
= |
15 = |
16 - 1 |
Idźmy dalej i zapiszmy wagę następnej pozycji przed najstarszą cyfrą jako potęgę liczby 2:
n = 1 |
Lmax = 211(2) |
= |
1 = |
2 - 1 |
= 21 - 1
|
|
n = 2 |
Lmax = 41211(2) |
= |
3 = |
4 - 1 |
= 22 - 1
|
|
n = 3 |
Lmax = 8141211(2) |
= |
7 = |
8 - 1 |
= 23 - 1
|
|
n = 4 |
Lmax = 1618141211(2) |
= |
15 = |
16 - 1 |
= 24 - 1
|
Teraz porównaj liczbę bitów n z wykładnikami potęg 2, to jest ta sama wartość. Zatem największa wartość n-bitowej liczby NBS wynosi:
Stąd n-bitowe liczby NBS posiadają zakres od 0 do 2n - 1.
Zapamiętaj dobrze ten wzór. Wartości minimalna i maksymalna określają zakres liczb, które może reprezentować n-bitowa liczba NBS. Dla przykładu policzmy zakresy kilku wybranych liczb NBS:
n = 4, zakres od 0 do 2 4 - 1, czyli od 0 do 15 n = 8, zakres od 0 do 2 8 - 1, czyli od 0 do 255 n = 16, zakres od 0 do 216 - 1, czyli od 0 do 65535
Teraz twoja kolej (nie licz ręcznie, użyj kalkulatora):
n = 32, zakres od 0 do ..., czyli od 0 do ... n = 64, zakres od 0 do ..., czyli od 0 do ...
Po co nam jest potrzebna znajomość zakresu? Gdy będziemy wykonywać obliczenia na komputerze, musimy wiedzieć, czy wynik zmieści się w zakresie używanych przez nas liczb. Wrócimy do tego przy programowaniu.
Jak zmienić algorytm schematu Hornera, aby obliczać wartość liczby pozycyjnej
o dowolnej podstawie p?
Na przykład:<>
p = 4, 123221034 = ?
Jak przekształcić wzór na zakres liczb n-bitowych NBS, aby obliczać zakres n-cyfrowych liczb przy dowolnej podstawie p > 1 ?
Zaczniemy od sposobu bezpośredniego. Załóżmy, że mamy znaleźć zapis 8-bitowej liczby NBS o wartości 189. Jak się do tego zabrać? Najpierw utwórzmy tabelkę z wagami 8-bitowej liczby NBS:
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra | – | – | – | – | – | – | – | – |
Cyfr będziemy szukać od najstarszej, do najmłodszej. Najstarsza cyfra ma wartość 1, jeśli waga jej pozycji mieści się w liczbie, czyli:
128 ≤ 189
Warunek spełniony, zatem najstarsza cyfra ma wartość 1:
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
– |
– |
– |
– |
– |
– |
– |
Wagę 128 musimy odjąć, od liczby:
189 - 128 = 61
Otrzymaliśmy nową wartość 61 – to wartość pozostałych cyfr liczby NBS. Kolejna waga 64 nie spełnia warunku:
64 ≤ 61
Zatem ta waga nie dodaje się do wartości liczby, cyfra na tej pozycji musi mieć wartość 0:
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
– |
– |
– |
– |
– |
– |
Bierzemy następną wagę 32:
32 ≤ 61
Warunek spełniony, cyfra 1:
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
1 |
– |
– |
– |
– |
– |
Obliczamy wartość pozostałych cyfr NBS:
61 - 32 = 29
Sprawdzamy dalej:
16 ≤ 29 → 1
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
1 |
1 |
– |
– |
– |
– |
29 - 16 = 13
8 ≤ 13 → 1
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
1 |
1 |
1 |
– |
– |
– |
13 - 8 = 5
4 ≤ 5 → 1
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
1 |
1 |
1 |
1 |
– |
– |
5 - 4 = 1
2 ≤ 1 → 0
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
– |
1 ≤ 1 → 1
Waga |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Cyfra |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
Mamy wszystkie cyfry, zatem:
189(10) = 10111101(NBS)
Dla większych liczb sposób ten nie jest wygodny. Stosujemy wtedy algorytm ogólny. Wyprowadzimy go ze wzoru na wartość liczby NBS. Aby uprościć obliczenia załóżmy, iż mamy 4-bitową liczbę NBS (wyniki można później uogólnić na liczbę o dowolnej liczbie bitów):
Co się stanie, gdy podzielimy z resztą tę wartość przez 2 (czyli przez podstawę systemu):
Zwróć uwagę, iż po podzieleniu liczby przez podstawę otrzymujemy liczbę z cyframi przesuniętymi o jedną pozycję w prawo, a jako resztę otrzymamy ostatnią cyfrę. Tak samo jest w każdym systemie pozycyjnym, np. w dziesiętnym:
Powtarzając tę operację z wynikiem dzielenia otrzymamy kolejną od końca cyfrę liczby. Operację kontynuujemy aż do wyzerowania wartości liczby. Dla przykładu przeliczmy w ten sposób liczbę 203 na NBC:
Operacja | Wynik | Reszta |
203 : 2 = |
101 |
1 |
101 : 2 = |
50 |
1 |
50 : 2 = |
25 |
0 |
25 : 2 = |
12 |
1 |
12 : 2 = |
6 |
0 |
6 : 2 = |
3 |
0 |
3 : 2 = |
1 |
1 |
1 : 2 = |
0 |
1 |
Otrzymaliśmy cyfry w kolejności od końca liczby, zatem musimy je zapisać w odwrotnym kierunku (od dołu do góry):
203(10) = 11001011(NBS)
Zapiszmy teraz algorytm przeliczania całkowitej liczby dziesiętnej (nieujemnej) na liczbę NBS:
wejście: L całkowita liczba nieujemna
wyjście: zapis w odwrotnym kierunku liczby L w kodzie NBS
Lista kroków:
K01: Pisz (L mod 2) K02: L ← L div 2 K03: Jeśli L > 0, to idź do kroku K01 K04: Zakończ
Pseudokod:
powtarzaj pisz L mod 2 L ← L div 2 aż do L = 0
Operacja mod (czytaj modulo) daje resztę z dzielenia całkowitego. Operacja div oznacza dzielenie całkowite.
Schemat blokowy:
Wykorzystując podany algorytm, przelicz na NBS liczby: 100, 1000, 10000.
Co należy zmienić w podanym algorytmie, aby przeliczać liczby dziesiętne na liczbę pozycyjną o dowolnej podstawie p > 1?
W systemie dwójkowym można wykonywać dodawanie dokładnie tak samo, jak w naszym systemie dziesiętnym. Musimy jednakże nauczyć się nowej tabliczki dodawania, która jest na szczęście bardzo prosta:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 i przeniesienie 1 do następnej pozycji
Zobaczmy jak to działa na prostym przykładzie. Dodamy dwie liczby NBS:
Ustawiamy liczby jedna pod drugą tak, aby zgadzały się pozycje cyfr obu liczb:
|
0 |
0 |
1 |
1 |
|
|
3 |
+ |
0 |
1 |
0 |
1 |
|
+ |
5 |
Zgodnie z tabelką dodawania sumujemy cyfry w ostatniej kolumnie, u góry notujemy przeniesienia na czerwono:
|
|
|
1
|
|
|
|
|
|
0 |
0 |
1 |
1 |
|
|
3 |
+ |
0 |
1 |
0 |
1 |
|
+ |
5 |
|
|
|
|
0 |
|
|
|
Obie cyfry 1, zatem zapisujemy wynik
|
|
1
|
1
|
|
|
|
|
|
0 |
0 |
1 |
1 |
|
|
3 |
+ |
0 |
1 |
0 |
1 |
|
+ |
5 |
|
|
|
0 |
0 |
|
|
|
Teraz sumujemy cyfry 1 i 0, dostając 1, ale musimy do tego wyniku dodać
przeniesienie 1. Wynikiem jest
|
1
|
1
|
1
|
|
|
|
|
|
0 |
0 |
1 |
1 |
|
|
3 |
+ |
0 |
1 |
0 |
1 |
|
+ |
5 |
|
|
0 |
0 |
0 |
|
|
|
Tutaj podobnie:
|
1
|
1
|
1
|
|
|
|
|
|
0 |
0 |
1 |
1 |
|
|
3 |
+ |
0 |
1 |
0 |
1 |
|
+ |
5 |
|
1 |
0 |
0 |
0 |
= |
|
8 |
Ostatnie dodawanie:
Zwróć uwagę, iż otrzymana liczba 1000(NBS) ma wartość dziesiętną 8 (wynik dodawania jest niezależny od wybranego systemu liczbowego).
Dla wprawy dodaj dwójkowo liczby:
0011 |
|
1001 |
|
1111 |
+1011 |
|
+0111 |
|
+0001 |
Liczba U2 składa się zawsze z ustalonej liczby bitów. Powodem jest to, iż waga najstarszej pozycji jest zawsze ujemna. 4 bitowa liczba U2 posiada następujące wagi pozycji:
-8
|
4 |
2 |
1 |
b3
|
b2
|
b1
|
b0
|
Wartość liczby U2 obliczamy dokładnie tak samo jak liczby NBS: sumujemy wagi pozycji zawierających bit 1. Najstarszy bit zwany jest bitem znaku (ang. sign bit). Jeśli ma on wartość 0, to liczba U2 jest dodatnia. Jeśli ma wartość 1, to liczba U2 jest ujemna (dlaczego?).
Poniżej zebraliśmy wartości wszystkich 4-bitowych liczb U2:
Wagi |
-8 |
4 |
2 |
1 |
|
|||
0 |
0 |
0 |
0 |
= |
0 |
= |
0 |
|
0 |
0 |
0 |
1 |
= |
1 |
= |
1 |
|
0 |
0 |
1 |
0 |
= |
2 |
= |
2 |
|
0 |
0 |
1 |
1 |
= |
2+1 |
= |
3 |
|
0 |
1 |
0 |
0 |
= |
4 |
= |
4 |
|
0 |
1 |
0 |
1 |
= |
4+1 |
= |
5 |
|
0 |
1 |
1 |
0 |
= |
4+2 |
= |
6 |
|
0 |
1 |
1 |
1 |
= |
4+2+1 |
= |
7 |
|
1 |
0 |
0 |
0 |
= |
-8 |
= |
-8 |
|
1 |
0 |
0 |
1 |
= |
-8+1 |
= |
-7 |
|
1 |
0 |
1 |
0 |
= |
-8+2 |
= |
-6 |
|
1 |
0 |
1 |
1 |
= |
-8+2+1 |
= |
-5 |
|
1 |
1 |
0 |
0 |
= |
-8+4 |
= |
-4 |
|
1 |
1 |
0 |
1 |
= |
-8+4+1 |
= |
-3 |
|
1 |
1 |
1 |
0 |
= |
-8+4+2 |
= |
-2 |
|
1 |
1 |
1 |
1 |
= |
-8+4+2+1 |
= |
-1 |
Na pierwszy rzut oka wygląda to dziwnie. Jeśli jednak przyjrzysz się dokładnie liczbie U2, to zauważysz, iż składa się ona jakby z dwóch części: pierwsza obejmuje bit znaku, druga jest zwykłą liczbą NBS:
Jeśli liczba U2 składa się z n bitów, to bit znaku jest zawsze na pozycji o numerze n - 1 (pozycje numerujemy od 0):
Ponieważ wagi pozycji są potęgami podstawy 2 o wykładniku równym numerowi pozycji, to pozycja bitu znakowego ma wagę -2n - 1. Zatem wartość n-bitowej liczby U2 wynosi:
Wzór jest dwuczęściowy. Na czerwono zaznaczono wartość części znakowej. Jeśli bit znaku bn-1 ma wartość 0, to część znakowa jest równa 0. Jeśli bit znakowy bn-1 ma wartość 1, to część znakowa jest równa wadze pozycji znakowej, czyli -2n-1. Druga część wzoru określa wartość pozostałych bitów liczby U2. Zwróć uwagę, iż jest to zwykła liczba NBS (n-1)-bitowa, którą sumujemy z częścią znakową. Daje nam to wskazówkę, jak obliczać wartość liczby U2: Obliczamy część znakową, obliczamy część NBS i sumujemy wyniki.
Obliczyć wartość liczby U2:
11110110U2 = ?
Liczymy bity liczby: jest ich 8. Zatem najstarsza pozycja ma wagę:
-28-1 = -27 = -128 .
Bit znaku ma wartość 1, zatem część znakowa ma wartość:
-128.
Pozostała część liczby jest zwykłą liczbą NBS. Obliczamy jej wartość przy pomocy schematu Hornera:
L = 1110110 |
|
|
W = 0 |
Bierzemy kolejne cyfry liczby: | |
1110110
|
W = 2 × 0 + 1 = 1 |
1110110
|
W = 2 × 1 + 1 = 3 |
1110110
|
W = 2 × 3 + 1 = 7 |
1110110
|
W = 2 × 7 + 0 = 14 |
1110110
|
W = 2 × 14 + 1 = 29 |
1110110
|
W = 2 × 29 + 1 = 59 |
1110110
|
W = 2 × 59 + 0 = 118 |
Sumujemy obie części i otrzymujemy wartość liczby U2:
11110110U2 = -128 + 118 = -10
Określimy teraz zakres n-bitowych liczb U2.
Największa wartość U2 nie może być ujemna, zatem bit znaku musi mieć wartość
0. Pozostałe bity tworzą wartość dodatnią NBS. Bitów tych jest
Korzystamy tutaj ze wzoru na wartość maksymalną liczby NBS, który wyprowadziliśmy wcześniej:
Dla n bitów LNBSmax = 2n - 1
Dla n - 1 bitów LNBSmax = 2n-1 - 1
Najmniejsza wartość U2 będzie wtedy, gdy bit znakowy przyjmie wartość 1, a wszystkie pozostałe bity będą miały wartość 0 (dlaczego?):
W takim przypadku wartość liczby U2 będzie równa wartości pozycji znakowej, czyli -2n-1. Łączymy te wyniki i otrzymujemy:
Zakres n-bitowych liczb U2 rozciąga się od
Zwróć uwagę, iż zakres liczb U2 nie jest symetryczny, jednakże mieści dokładnie 2n różnych liczb (sprawdź to). Policzmy zakresy wybranych liczb U2:
n = 4, zakres U2:od -2 4 - 1 do 2 4 - 1 - 1, czyli od -8 do 7 n = 8, zakres U2: od-2 8 - 1 do 2 8 - 1 - 1, czyli od -128 do 127 n = 16, zakres U2:od -216 - 1 do 216 - 1 - 1 , czyli od -32768 do 32767
Teraz twoja kolej (użyj kalkulatora):
n = 32, zakres U2: n = 64, zakres U2:
Jest jeszcze jedna ciekawa rzecz: na przykładzie kodów NBS i U2 widać wyraźnie, iż informacja reprezentowana przez bity zależy od ich interpretacji. Poniższa tabelka przedstawia wartości 4-bitowych liczb NBS i U2:
Wartość | ||
Kod | jako NBS |
jako U2 |
0000 |
0 |
0 |
0001 |
1 |
1 |
0010 |
2 |
2 |
0011 |
3 |
3 |
0100 |
4 |
4 |
0101 |
5 |
5 |
0110 |
6 |
6 |
0111 |
7 |
7 |
1000 |
8 |
-8 |
1001 |
9 |
-7 |
1010 |
10 |
-6 |
1011 |
11 |
-5 |
1100 |
12 |
-4 |
1101 |
13 |
-3 |
1110 |
14 |
-2 |
1111 |
15 |
-1 |
Do wszystkich nowododanych bitów kopiujemy bit znakowy.
Mamy liczbę 0110U2 i chcemy rozszerzyć ją na 8 bitów. Bit znakowy ma stan 0, zatem dopisujemy na początku 4 bity 0:
0110U2 → 0000 0110U2 → 00000110U2
Sprawdź, że nowa liczba ma tę samą wartość co poprzednia.
Mamy liczbę 1110U2 i chcemy rozszerzyć ją na 8 bitów. Bit znakowy wynosi teraz 1, zatem dopisujemy do liczby 4 bity 1:
1110U2 → 1111 1110U2 → 11111110U2
Sprawdź, że nowa liczba ma tę samą wartość co poprzednia
Aby znaleźć liczbę U2 przeciwną do danej liczby U2, postępujemy następująco:
Rozpoczynamy od najmłodszego bitu danej liczby i będziemy się przesuwać w lewo. Do liczby przeciwnej kopiujemy wszystkie napotkane bity 0, aż dojdziemy do bitu 1, który też kopiujemy. Wszystkie pozostałe bity kopiujemy zamieniając je na bit przeciwny (0 → 1; 1 → 0).
Znaleźć liczbę U2 przeciwną do danej 00111010100U2.
1. Kopiujemy bity 0 i pierwszy bit 1:
00111010100
|
100
|
2. Kopiujemy pozostałe bity zamieniając je na przeciwne:
00111010100
|
11000101100
|
Otrzymaliśmy wynik 11000101100U2.
Sprawdźmy, czy wynik jest prawidłowy. Najpierw liczymy wartość pierwszej liczby (pomijamy bit znaku równy 0, liczba jest dodatnia):
L1 = 00111010100U2
L = 0111010100 |
|
|
W = 0 |
0111010100
|
W = 2 × 0 + 0 = 0 |
0111010100
|
W = 2 × 0 + 1 = 1 |
0111010100
|
W = 2 × 1 + 1 = 3 |
0111010100
|
W = 2 × 3 + 1 = 7 |
0111010100
|
W = 2 × 7 + 0 = 14 |
0111010100
|
W = 2 × 14 + 1 = 29 |
0111010100
|
W = 2 × 29 + 0 = 58 |
0111010100
|
W = 2 × 58 + 1 = 117 |
0111010100
|
W = 2 × 117 + 0 = 234 |
0111010100
|
W = 2 × 234 + 0 = 468 |
L1 = 468 L2 = 11000101100U2
Bit znakowy jest równy 1, jest to zatem liczba ujemna.
Obliczamy wagę pozycji znakowej:
Obliczamy wartość pozostałych bitów liczby:
L =1000101100 |
|
|
W = 0 |
1000101100
|
W = 2 × 0 + 1 = 1 |
1000101100
|
W = 2 × 1 + 0 = 2 |
1000101100
|
W = 2 × 2 + 0 = 4 |
1000101100
|
W = 2 × 4 + 0 = 8 |
1000101100
|
W = 2 × 8 + 1 = 17 |
1000101100
|
W = 2 × 17 + 0 = 34 |
1000101100
|
W = 2 × 34 + 1 = 69 |
1000101100
|
W = 2 × 69 + 1 = 139 |
1000101100
|
W = 2 × 139 + 0 = 278 |
1000101100
|
W = 2 × 278 + 0 = 556 |
Sumujemy część znakową z wartością pozostałych bitów:
L2 = -1024 + 556 = -468 = -L1
Zwróć uwagę, iż taki sposób znajdowania liczby przeciwnej nie wymaga żadnych obliczeń, dlatego warto go zapamiętać.
Jeśli chcemy przeliczyć wartość dziesiętną na liczbę U2 postępujemy następująco:
Bit znakowy będzie równy 0, a reszta bitów to liczba NBS o wartości przeliczanej liczby. Wyznaczamy zatem liczbę NBS i rozszerzamy do formatu liczby U2 dodając bity 0 w miarę potrzeb.
Przykład:
Przeliczyć liczbę 100(10) na 8-bitową liczbę U2.
Wyznaczamy liczbę NBS o wartości 100:
Operacja | Wynik | Reszta |
100 : 2 |
50 |
0 |
50 : 2 |
25 |
0 |
25 : 2 |
12 |
1 |
12 : 2 |
6 |
0 |
6 : 2 |
3 |
0 |
3 : 2 |
1 |
1 |
1 : 2 |
0 |
1 |
Otrzymujemy liczbę 1100100NBS. Rozszerzamy do 8 bitów:
Bit znakowy będzie równy 1. Wartość pozycji znakowej będzie równa z = -2n-1, gdzie n oznacza ilość bitów liczby U2. Naszym zadaniem jest znalezienie pozostałych bitów liczby U2. Korzystamy ze wzoru na wartość liczby U2:
LU2 = z + L Gdzie: Obliczamy L: L = -z + LU2 |
Znając wartość L przeliczamy ją na liczbę NBS, wynik rozszerzamy do formatu liczby U2, dodajemy bit znakowy i mamy liczbę U2.
Przykład:
Przeliczyć -100(10) na 8-bitową liczbę U2.
Obliczamy część znakową:
z = -27 = -128
Obliczamy wartość pozostałych bitów liczby U2:
L = -z + (-100(10))
L = 128 - 100 = 28
Znajdujemy liczbę NBS wartości 28:
Operacja | Wynik | Reszta |
28 : 2 |
14 |
0 |
14 : 2 |
7 |
0 |
7 : 2 |
3 |
1 |
3 : 2 |
1 |
1 |
1 : 2 |
0 |
1 |
Otrzymujemy 11100. Uzupełniamy zerami do 7 bitów i dodajemy bit znaku:
1 00 11100 → 10011100U2 = -100(10).
Więcej na ten temat znajdziesz w artykule "Przeliczanie liczb dziesiętnych na liczby U2".
Teraz wyjaśnimy, dlaczego wybrano format U2 do reprezentacji liczb całkowitych (dodatnich, ujemnych i zera). Powodem było to, iż liczby U2 można dodawać wg tych samych zasad co liczby NBS. Dzięki temu mikroprocesor wykorzystuje te same układy arytmetyczne dla obu formatów, co w efekcie upraszcza jego konstrukcję oraz koszt. Różnica polega na odmiennej interpretacji wyniku. Istnieją tutaj specjalne przypadki, jednak nie będziemy zaprzątać ci nimi głowy (jeśli cię to interesuje, przeczytaj podany wcześniej artykuł). Podamy jedynie prosty przykład: mamy dodać dwie 4-bitowe liczby U2:
L1 = 0111U2 = 7 ( 4 + 2 + 1) L2 = 1101U2 = -3 (-8 + 4 + 1)
|
0 |
1 |
1 |
1 |
|
|
7
|
+ |
1 |
1 |
0 |
1 |
|
+ |
(-3) |
1 |
1 |
1 |
1 |
|
|
|
|
|
0 |
1 |
1 |
1 |
|
|
7
|
+ |
1 |
1 |
0 |
1 |
|
+ |
(-3) |
|
0 |
1 |
0 |
0 |
|
|
4
|
Ignorujemy przeniesienie poza bit znaku (to jeden z tych przypadków). Otrzymaliśmy poprawny wynik. Aby wynik był poprawny, musi się mieścić w zakresie używanych liczb U2. Dokładniej pomówimy o tym przy programowaniu.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.