3.3. Zapis liczb binarnych ze znakiem 1 0-1 0 1 : 1 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 reszta 0 0 0 0 0 0 0 1 3.3. Zapis liczb binarnych ze znakiem W systemie dziesiętnym liczby ujemne opatrzone są specjalnym znakiem graficznym, tzw. minusem, na przykład 6, 22 itd., a liczby dodatnie w niektórych przypadkach plusem +, na przykład +5, +20. W systemie binarnym opartym wyłącznie na zerach i jedynkach brakuje dodatkowego znaku, który wskazywałby na ujemny lub dodatni charakter określonej liczby. Opracowano kilka metod zapisu liczb binarnych ze znakiem, które charakteryzują się różnym stopniem przydatności, między innymi: qq qq qq metodę znak-moduł (ZM), metodę uzupełnień do 1 (U1), metodę uzupełnień do 2 (U2). 3.3.1. Metoda znak-moduł (ZM) W metodzie znak-moduł zastosowano prosty zabieg kodowania znaku za pomocą najstarszej cyfry w liczbie binarnej. Najstarszą cyfrę określa się jako znak, pozostałe cyfry są modułem reprezentującym daną liczbę binarną: znak moduł a n 1 a n 2 a 1 a 0 51
Rozdział 3 t Arytmetyka liczb binarnych W celu obliczenia wartości naturalnej liczby binarnej ze znakiem należy posłużyć się następującym wzorem: Stosując powyższy (zmodyfikowany) zapis wielomianowy, możemy zauważyć, że znak otrzymanej po obliczeniu liczby zależny jest od wyrażenia: 1 2*najstarsza cyfra liczby. Jeżeli najstarsza cyfra jest jedynką, to wynikiem wyrażenia będzie 1 ; jeżeli zerem, to otrzymamy 1. Obliczony moduł należy przemnożyć przez wyrażenie znakowe, dzięki czemu otrzyma się dodatnią lub ujemną liczbę dziesiętną będącą odpowiednikiem danej liczby binarnej. Aby uzyskać liczbę binarną ze znakiem na podstawie liczby dziesiętnej, należy obliczyć moduł metodą dzielenia przez podstawę (2), a następnie dołączyć 0, jeżeli chce się mieć liczbę dodatnią, lub 1 dla liczby ujemnej. Przykłady: 0111 (Z-M) = 0 1 2 = (1 2*0)*(1*2 2 +1*2 1 +1*2 0 ) = 1*(4+2+1) = 7 D 1111 (Z-M) = 2 = (1 2*1)*(1*2 2 +1*2 1 +1*2 0 ) = 1*(4+2+1) = 7 D Jedną z wad metody ZM jest brak możliwości prostego wykonywania operacji arytmetycznych, co znacznie ogranicza jej powszechne stosowanie: ZM 6 D + 0 1 ZM + 6 D 0 20 D Kolejną niedogodnością związaną z systemem znak-moduł jest to, że zero może zostać zapisane na dwa sposoby: ze znakami plus i minus. Stanowi to przykład nieefektywności tej metody, w której tracony jest jeden wyraz kodowy. 3.3.2. Metoda uzupełnień do 2 (U2) Niedoskonałości systemu ZM spowodowały, że konieczne było opracowanie bardziej naturalnej metody zapisu liczb binarnych ze znakiem. Powstała metoda uzupełnień do 2 (U2), gdzie cyfra określająca znak jest zintegrowana z liczba binarną, co pozwala na wykonywanie obliczeń arytmetycznych. W celu obliczenia wartości liczby binarnej z wykorzystaniem metody U2 należy zastosować poniższy wzór: 52
3.3. Zapis liczb binarnych ze znakiem W metodzie U2 wyrażenie znaku jest tak skonstruowane, że uczestniczy w wartości liczby jak pozostałe pozycje. Wartość podstawy w wadze najstarszej liczby określającej znak jest ujemna. Przykłady: 0111 B = 0 3 1 2 = 0*( 2 3 )+1*(2 2 )+1*(2 1 )+1*(2 0 ) = 4+2+1 = 7 B 1111 B = 1 3 1 2 = 1*( 2 3 )+1*(2 2 )+1*(2 1 )+1*(2 0 ) = 8+4+2+1 = 1 B Jak widać w przykładach, liczby binarne dodatnie i ujemne U2 wyglądają po przekształceniu na dziesiętne inaczej niż w przypadku metody ZM. Przekształcenie ujemnej liczby dziesiętnej na postać binarną jest bardziej pracochłonne niż w metodzie ZM. 1. Na początku obliczamy postać binarną z wartości bezwzględnej dziesiętnej liczby ujemnej: 5:2 = 2 r = 1 2:2 = 1 r = 0 1:2 = 0 r = 1 5 D = 5 D = 5 D = 101 B 2. Powstałą liczbę binarną należy uzupełnić zerami do liczby cyfr będących krotnością dwójki. W tym przypadku, gdy liczba binarna ma 3 cyfry, dopełniamy do 4. Jeżeli byłoby 5 cyfr, należałoby uzupełnić do ośmiu itd. 0101 B 3. 4. Następnie należy zamienić wszystkie cyfry w liczbie binarnej na przeciwne, czyli jedynki na zera i odwrotnie: 1010 W ostatnim etapie do powstałej liczby dodaje się binarną jedynkę wynik jest ujemną liczbą binarną: + 0 0 0 1 1 3 0 2 = 1( 2 3 )+0(2 2 )+1(2 1 )+1(2 0 ) = 8+3 = 5 53
Rozdział 3 t Arytmetyka liczb binarnych 3.4. Liczby binarne stałoi zmiennoprzecinkowe Podobnie jak w systemie dziesiętnym liczby binarne również mogą być zapisane w postaci ułamkowej. Zapis binarnych liczb pozycyjnych z przecinkiem może przyjąć postać stało- lub zmiennoprzecinkową. 3.4.1. Liczby stałoprzecinkowe (stałopozycyjne) Liczby stałoprzecinkowe (ang. fixed-point numbers) umożliwiają zapis liczb w postaci ułamkowej, w którym pozycja przecinka ustalana jest arbitralnie w zależności od wymaganej dokładności. Binarną liczbę stałoprzecinkową można potraktować jako złożenie dwóch części liczby całkowitej oraz ułamkowej rozdzielonych przecinkami: część całkowita część ułamkowa 10110011, 0101 W celu przekształcenia binarnej liczby stałoprzecinkowej na postać dziesiętną należy posłużyć się poniższym wzorem: a n-1 a 1 a 0, a -1 a -m = a n-1 *2 n-1 + +a 1 *2 1 +a 0 *2 0 +a -1 *2-1 + +a -m *2 -m Wartości wag części ułamkowej przyjmują postać ułamków, gdzie dokładność określona jest przez wagę najmłodszej cyfry. Przykłady: 1101,11 B = 1 3 1 2 0 1, 1-1 1-2 = 1*2 3 +1*2 2 +0*2 1 +1*2 0 +1*2-1 +1*2-2 = 8+4+1+½+¼ = 13,75 D 11100101,1011 = 2 7 +2 6 +2 5 +2 2 +2 0 +2-1 +2-3 +2-4 = 128+64+32+4+1+½+ 1 / 8 + 1 / 16 = 229,6875 D Zamianę liczby dziesiętnej na postać binarną przeprowadza się w dwóch etapach: qq zamiana liczby całkowitej na postać binarną za pomocą cyklicznego dzielenia przez 2; qq zamiana części ułamkowej na postać binarną za pomocą cyklicznego mnożenia przez 2. Jeżeli wynik jest 1, to wyznaczony bit części ułamkowej jest także równy 1. Do dalszych obliczeń wykorzystuje się część ułamkową wyniku. Proces należy wykonywać aż do otrzymania 0. Z wyników iloczynów pobiera się wartości całkowite ułamek liczby binarnej. Otrzymane liczby łączymy, przedzielając część całkowitą i ułamkową przecinkiem. Jeżeli mnożenie przez 2 prowadzi do osiągnięcia nieskończenie długiej kombinacji zer i jedynek, należy przyjąć przybliżoną dokładność, na przykład do 10 miejsc po przecinku. 54
3.4. Liczby binarne stało- i zmiennoprzecinkowe Przykład: 10,225 10, 225 10:2 = 5 r = 0 5:2 = 2 r = 1 2:2 = 1 r = 0 1:2 = 0 r = 1 10 D = 1010 B 1. 0,225*2 = 0,45 część całkowita 0 2. 0,45*2 = 0,9 część całkowita 0 3. 0,9*2 = 1,8 część całkowita 1 4. 0,8*2 = 1,6 część całkowita 1 5. 0,6*2 = 1,2 część całkowita 1 6. 0,2*2 = 0,4 część całkowita 0 7. 0,4*2 = 0,8 część całkowita 0 8. 0,8*2 = 1,6 część całkowita 1 9. 0,6*2 = 1,2 część całkowita 1 10. 0,2*2 = 0,4 część całkowita 0 0,225 D = 0,0011100110 B 10,225 D = 1010,0011100110 B 3.4.2. Liczby zmiennoprzecinkowe (zmiennopozycyjne) W odróżnieniu od liczb stałoprzecinkowych liczby zmiennoprzecinkowe (ang. floating-point numbers FP) umożliwiają obsługę większego zakresu liczb (bardzo małych lub bardzo dużych), jednak kosztem wolniejszego przetwarzania i mniejszej dokładności. Termin zmiennoprzecinkowe oznacza, że nie istnieje stała liczba cyfr przed przecinkiem i po nim. UWAGA Komputery przetwarzają najczęściej liczby zmiennoprzecinkowe w przybliżeniu. Nieuwaga programisty podczas operowania na liczbach zmiennoprzecinkowych może prowadzić do przekłamań w otrzymanych wynikach. 55
Rozdział 3 t Arytmetyka liczb binarnych Liczba zmiennoprzecinkowa składa się z dwóch części: liczby stałoprzecinkowej (ang. mantissa mantysa, m) oraz podstawy (p) podniesionej do potęgi, zwanej cechą lub wykładnikiem (ang. exponent, e): l FP = m*b e W celu zamiany zmiennoprzecinkowej liczby binarnej na postać dziesiętną należy ze słowa kodu wydobyć cyfry cechy i mantysy (na przykład 110010 4 cyfry cechy i 4 mantysy): cecha mantysa b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 Za pomocą metody uzupełnień do 2 oblicza się wartość cechy: e = b 7 ( 2 3 )+b 6 2 2 +b 5 2 1 +b 4 2 0 = ( 8)b 7 +4b 6 +2b 5 +b 4 Mantysa jest najczęściej liczbą stałoprzecinkową z przedziału [1, 2). Oblicza się ją na podstawie wzoru: m = b 3 b 2, b 1 b 0 = b 3 ( 2 1 )+b 2 2 0 +b 1 2-1 +b02-2 = 2b 3 +b 2 +½b 1 +¼b 2 Otrzymaną cechę i mantysę podstawia się do wzoru: Przykłady: l FP = m*2 e 111001 FP e = 1111 U2 1111 U2 = 8+4+2+1 = 1 D m = 10,01 U2 10,01 U2 = 2+¼ = 1,75 D l FP = m*2 e = 1¾*2-1 = 7 / 4 *½ = 0,875 11111001 FP = 0,875 D 000100 FP e = 0001 U2 0001 U2 = 1 D m = 01,00 U2 01,00 U2 = 1 D l FP = m*2 e = 1*2 1 = 1*2 = 2 00010100 FP = 2 D Zamianę liczby dziesiętnej na postać binarną można wykonać, stosując metodę dla liczb stałoprzecinkowych. 56
3.4. Liczby binarne stało- i zmiennoprzecinkowe Przykład: 13,7 D 13:2 = 6 r = 1 6:2 = 3 r = 0 3:2 = 1 r = 1 1:2 = 0 r = 1 13 D = 1101 B 0,7*2 = 1,4 część całkowita 1 0,4*2 = 0,8 część całkowita 0 0,8*2 = 1,6 część całkowita 1 0,6*2 = 1,2 część całkowita 1 13,7 D = 1101,1011 B ĆWICZENIA 1. Dokonaj konwersji liczb binarnych do postaci dziesiętnej z wykorzystaniem zapisu wielomianowego: a. 11011011 B b. 10010011 B 2. W celu sprawdzenia wyników pierwszego ćwiczenia liczby dziesiętne przekształć na liczby binarne za pomocą cyklicznego dzielenia przez podstawę. 3. Dokonaj konwersji liczb szesnastkowych do postaci dziesiętnej z wykorzystaniem zapisu wielomianowego: a. F3A H b. 952 H 4. W celu sprawdzenia wyników z pierwszego ćwiczenia liczby dziesiętne przekształć na liczby binarne za pomocą cyklicznego dzielenia przez podstawę. 5. Dokonaj konwersji liczby binarnej 1011011011 do postaci szesnastkowej B z wykorzystaniem zapisu wielomianowego. 57
Rozdział 3 t Arytmetyka liczb binarnych ĆWICZENIA ciąg dalszy 6. Wykonaj działania arytmetyczne na liczbach binarnych: a. 1 1 +???? b. 1 0 1???? c. 1 1 d.??????? : 7. Przekształć liczby binarne ze znakiem do postaci dziesiętnej za pomocą kodu U2: a. 0101 B b. 1101 B 8. Przekształć dziesiętną liczbę 7 do postaci binarnej. D 9. Przekształć binarną liczbę stałoprzecinkową 1001,11 do postaci dziesiętnej. B 10. Przekształć ułamkową liczbę dziesiętną 17,6 do postaci binarnej. D 58
3.4. Liczby binarne stało- i zmiennoprzecinkowe Pytania i polecenia kontrolne 1. 2. 3. 4. 5. Wymień pozycyjne systemy liczbowe. Opisz sposoby konwersji liczb heksadecymalnych na binarne i binarnych na heksadecymalne. Co to jest tabliczka dodawania i odejmowania liczb binarnych? Jakie niedoskonałości skrywa metoda znak-moduł? Jakie niebezpieczeństwo pojawia się przy zaokrąglaniu binarnych liczb zmiennoprzecinkowych? 59