Reprezentacja binarna liczb ujemnych
Liczba ujemna w systemie dziesiętnym jest poprzedzona
znakiem minus. W komputerze, każda informacja musi mieć postać ciągu zer i
jedynek, dlatego znak liczby jest reprezentowany przez dodatkową cyfrę
dwójkową, zwaną bitem znaku, która poprzedza właściwe cyfry liczby. Cyfra 1 na
pozycji bitu znaku zastępuje tradycyjny znak minus w zapisie liczb ujemnych, a 0 występuje
zawsze przed liczbami nieujemnymi. Bitu znaku liczby w reprezentacji binarnej
nie można pominąć.
Zgodnie z tą umową, jeśli liczba jest reprezentowana na
siedmiu bitach, włącznie z bitem znaku, to mamy (bit znaku został pogrubiony):
- 25
= 0011001
- -25
= 1011001
W reprezentacji dziesiętnej suma danej liczby i jej
przeciwnej zawsze daje ten sam wynik - zero. Tak niestety nie jest, gdy ujemne
liczby binarne różnią się od dodatnich tylko bitem znaku - przekonajcie się o
tym, wybierając w tabeli kilka par liczb przeciwnych z trzeciej kolumny oraz
odpowiadające im rozwinięcia binarne z pierwszej kolumny w tej tabeli.
Własność sumowania do zera pary liczb przeciwnych w
zapisie binarnym ma reprezentacja uzupełnieniowa, zwana również kodem
uzupełnieniowym. Tworzymy ją w następujący sposób. Dla dowolnej liczby
całkowitej "a", jej reprezentacja uzupełnieniowa na "n"
bitach, przeznaczonych na reprezentację, (włacznie z bitem znaku) ma postać:
- reprezentacja
binarna liczby "a", gdzy a≤0
- reprezentacja
binarna liczby 2n + "a", gdy a<0
W tym przypadku dla n=7 mamy:
- 25
= 0011001
- -25
= 1100111,
gdyż ma to być reprezentacja liczby 27 +(-25)
= 128 - 25 = 103,
Sprawdzimy, ile wynosi suma podanych wyżej liczb:
Sprawdzimy, ile wynosi suma podanych wyżej liczb:
25 + (-25) = 0011001 + 1100111 = (1) 0000000
Wynik ograniczyliśmy do 7 bitów, bo na tylu bitach są
pamiętne obie dodawane liczby, zatem pomijamy bit o wartości 1 powstały z
przeniesienia.
Algorytm: Przedstawianie liczby ujemnej w reprezentacji
uzupełnieniowej
Dane:
Binarne rozwinięcie liczby naturalnej "a" (wraz z bitem znaku równym 0).
Binarne rozwinięcie liczby naturalnej "a" (wraz z bitem znaku równym 0).
Wynik:
Binarne rozwinięcie liczby przeciwnej -a (wraz z bitem znaku) w reprezentacji uzupełnieniowej.
Binarne rozwinięcie liczby przeciwnej -a (wraz z bitem znaku) w reprezentacji uzupełnieniowej.
Krok. Posuwając się od prawej do lewej, czyli
w kierunku od najmniej znaczącego bitu, pozostawiaj bez zmian wszystkie
początkowe bity równe zero i pierwszy bit równy 1, a każdy następny bit
zamień na przeciwny, czyli 0 na 1, a 1 na 0.
Reprezentacja stałopozycyjna liczb
-2n-1 .. 2n-1-1
Przykład
n=8: -27 .. 27-1, czyli -128 .. 127, odpowiada to typowi danych ShortInt (C++: char)
n=16: -215 .. 215-1, czyli -32788 .. 32787, odpowiada to typowi danych Integer (C++: short)
n=32: -231 .. 231-1, czyli -2 147 483 648 .. 2 147 483 647, odpowiada to typowi danych LongInt (C++: int)
Reprezentacja stałopozycyjna liczb
- Reprezentacja
stałopozycyjna charakteryzuje się stałym położeniem kropki dziesiętnej.
- Na
część całkowitą liczby oraz na część ułamkową przeznaczona jest stała, z
góry określona liczba bitów.
- Jeśli
na część ułamkową przeznaczone jest 0 bitów to reprezentacja
stałopozycyjna służy do przechowywania liczb całkowitych.
- Jeśli
liczba, którą chcemy przedstawić w tej reprezentacji, mieści się na
ustalonej liczbie bitów, to może być reprezentowana dokładnie.
- Jeśli
wynik działań wykonywanych na liczbach stałopozycyjnych nie mieści się na
ustalonej liczbie bitów, powstaje nadmiar w obliczeniach (wynik jest
błędnie interpretowany przez komputer).
-2n-1 .. 2n-1-1
Przykład
n=8: -27 .. 27-1, czyli -128 .. 127, odpowiada to typowi danych ShortInt (C++: char)
n=16: -215 .. 215-1, czyli -32788 .. 32787, odpowiada to typowi danych Integer (C++: short)
n=32: -231 .. 231-1, czyli -2 147 483 648 .. 2 147 483 647, odpowiada to typowi danych LongInt (C++: int)
Deklaracja odpowiedniego typu zmiennych w programie określa dopuszczalny zakres
danych.
Reprezentacja zmiennopozycyjna liczb
- Reprezentacja
zmiennopozycyjna charakteryzuje się zmiennym położeniem kropki
dziesiętnej.
Przykład
602252000000000000000000*101
|
wartość liczby jest w każdym przypadku taka sama,
zmienia się tylko położenie kropki dziesiętnej
|
||
6,02252*1023
|
|||
0,602252*1024
|
|||
602252*1022
|
- W
podobny sposób przedstawiane są liczby w formacie naukowym w arkuszu
kalkulacyjnym: 4,92e36, czyli 4,92*10+36
Aby liczby zapisane w ten sposób można było porównywać
ze sobą, stosuje się znormalizowaną reprezentację zmiennopozycyjną, gdzie
liczba przedstawiona jest jako iloczyn
a=m*10c
m - mantysa, 0,1<=|m|<1
c - cecha, liczba całkowita
Przykład: 0,662607*10-33
Podstawa matematyczna
Wartość liczby zmiennoprzecinkowej jest obliczana według
wzoru:
gdzie:
- S (ang. sign)
– znak liczby, 1 lub -1
- M (ang. mantissa)
– znormalizowana mantysa, liczba ułamkowa
- B (ang. base)
– podstawa systemu liczbowego (2 dla systemów komputerowych)
- E (ang. exponent)
– wykładnik, liczba całkowita
Mantysa jest znormalizowana, tj. należy do
przedziału (przedział
prawostronnie otwarty!). Jeżeli M jest stałe, a E zmienia
się, wówczas przesunięciu ulega przecinek – stąd właśnie pochodzi nazwa tej
reprezentacji.
Zarówno dla mantysy jak i wykładnika liczba cyfr jest z góry
ustalona. Zatem dana liczba jest reprezentowana z
pewną skończoną dokładnością i należy do skończonego zbioru
wartości.
Brak komentarzy:
Prześlij komentarz