3.3. Zapis liczb binarnych ze znakiem – reszta 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1-1 0 1 0 1 0 0 1 1 – 1 0 1 0 1 1 1 – 1 0 1 0 1 0 1 – 1 0 1 0 0 0 0 – 1 0 1 0 0 0 1 – 1 0 1 0 0 0 1 0 0 0 0 : 1 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 metodę znak-moduł (ZM), qq metodę uzupełnień do 1 (U1), qq 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 an–1 moduł an–2 … a1 a0 51 urzadzenia_techniki_komputerowej.indb 51 2010-06-01 11:02:28 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 12 11 10 = (1–2*0)*(1*22+1*21+1*20) = 1*(4+2+1) = 7D 1111(Z-M) = 1 12 11 10 = (1–2*1)*(1*22+1*21+1*20) = –1*(4+2+1) = –7D Jedną z wad metody ZM jest brak możliwości prostego wykonywania operacji arytmetycznych, co znacznie ogranicza jej powszechne stosowanie: 1 1 1 0ZM + 0 1 1 0ZM 1 0 1 0 0 –6D + 6D 20D 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 urzadzenia_techniki_komputerowej.indb 52 2010-06-01 11:02:28 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: 0111B = 03 12 11 10 = 0*(–23)+1*(22)+1*(21)+1*(20) = 4+2+1 = 7B 1111B = 13 12 11 10 = 1*(–23)+1*(22)+1*(21)+1*(20) = –8+4+2+1 = –1B 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 –5D = |–5D| = 5D = 101B 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. 0101B 3. Następnie należy zamienić wszystkie cyfry w liczbie binarnej na przeciwne, czyli jedynki na zera i odwrotnie: 1010 4. W ostatnim etapie do powstałej liczby dodaje się binarną jedynkę — wynik jest ujemną liczbą binarną: + 1 0 1 0 0 0 0 1 1 0 1 1 13 02 11 10 = 1(–23)+0(22)+1(21)+1(20) = –8+3 = –5 53 urzadzenia_techniki_komputerowej.indb 53 2010-06-01 11:02:29 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: an-1 … a1 a0 , a-1 … a-m = an-1*2n-1+…+a1*21+a0*20+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,11B = 13 12 01 10, 1-1 1-2 = 1*23+1*22+0*21+1*20+1*2-1+1*2-2 = 8+4+1+½+¼ = 13,75D 11100101,1011 = 27+26+25+22+20+2-1+2-3+2-4 = 128+64+32+4+1+½+1/8+1/16 = 229,6875D Zamianę liczby dziesiętnej na postać binarną przeprowadza się w dwóch etapach: qq z amiana liczby całkowitej na postać binarną za pomocą cyklicznego dzielenia przez 2; qq z amiana 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 urzadzenia_techniki_komputerowej.indb 54 2010-06-01 11:02:29 3.4. Liczby binarne stało- i zmiennoprzecinkowe Przykład: 10,225 10 , 225 10:2 = 5 5:2 = 2 2:2 = 1 1:2 = 0 r=0 r=1 r=0 r=1 10D = 1010B 1. 0,225*2 = 0,45 2. 0,45*2 = 0,9 3. 0,9*2 = 1,8 4. 0,8*2 = 1,6 5. 0,6*2 = 1,2 6. 0,2*2 = 0,4 7. 0,4*2 = 0,8 8. 0,8*2 = 1,6 9. 0,6*2 = 1,2 10. 0,2*2 = 0,4 część całkowita 0 część całkowita 0 część całkowita 1 część całkowita 1 część całkowita 1 część całkowita 0 część całkowita 0 część całkowita 1 część całkowita 1 część całkowita 0 0,225D = 0,0011100110B 10,225D = 1010,0011100110B 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 urzadzenia_techniki_komputerowej.indb 55 2010-06-01 11:02:29 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): lFP = m*be W celu zamiany zmiennoprzecinkowej liczby binarnej na postać dziesiętną należy ze słowa kodu wydobyć cyfry cechy i mantysy (na przykład 1101 1010 — 4 cyfry cechy i 4 mantysy): cecha mantysa b6 b7 b5 b4 b3 b2 b1 b0 Za pomocą metody uzupełnień do 2 oblicza się wartość cechy: e = b7(–23)+b622+b521+b420 = (–8)b7+4b6+2b5+b4 Mantysa jest najczęściej liczbą stałoprzecinkową z przedziału [1, 2). Oblicza się ją na podstawie wzoru: m = b3b2, b1b0 = b3(–21)+b220+b12-1+b02-2 = –2b3+b2+½b1+¼b2 Otrzymaną cechę i mantysę podstawia się do wzoru: lFP = m*2e Przykłady: 1111 1001FP e = 1111U2 1111U2 = –8+4+2+1 = –1D m = 10,01U2 10,01U2 = –2+¼ = –1,75D lFP = m*2e = –1¾*2-1 = –7/4*½ = –0,875 11111001FP = –0,875D 0001 0100FP e = 0001U2 0001U2 = 1D m = 01,00U2 01,00U2 = 1D lFP = m*2e = 1*21 = 1*2 = 2 00010100FP = 2D Zamianę liczby dziesiętnej na postać binarną można wykonać, stosując metodę dla liczb stałoprzecinkowych. 56 urzadzenia_techniki_komputerowej.indb 56 2010-06-01 11:02:29 3.4. Liczby binarne stało- i zmiennoprzecinkowe Przykład: 13,7D 13:2 = 6 r=1 6:2 = 3 r=0 3:2 = 1 r=1 1:2 = 0 r=1 13D = 1101B 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,7D = 1101,1011B ĆWICZENIA 1.Dokonaj konwersji liczb binarnych do postaci dziesiętnej z wykorzystaniem zapisu wielomianowego: a. 11011011B b. 10010011B 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. F3AH b. 952H 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 1011011011B do postaci szesnastkowej z wykorzystaniem zapisu wielomianowego. 57 urzadzenia_techniki_komputerowej.indb 57 2010-06-01 11:02:29 Rozdział 3 t Arytmetyka liczb binarnych ĆWICZENIA ciąg dalszy 6.Wykonaj działania arytmetyczne na liczbach binarnych: a. 1 1 0 1 1 0 1 1 ? ? ? ? 1 1 0 0 1 0 1 1 ? ? ? ? 1 1 0 1 1 0 1 0 ? ? ? ? ? ? ? 0 1 1 : 1 + b. – c. × d. 1 0 7.Przekształć liczby binarne ze znakiem do postaci dziesiętnej za pomocą kodu U2: a. 0101B b. 1101B 8.Przekształć dziesiętną liczbę –7D do postaci binarnej. 9.Przekształć binarną liczbę stałoprzecinkową 1001,11B do postaci dziesiętnej. 10. Przekształć ułamkową liczbę dziesiętną 17,6D do postaci binarnej. 58 urzadzenia_techniki_komputerowej.indb 58 2010-06-01 11:02:29 3.4. Liczby binarne stało- i zmiennoprzecinkowe Pytania i polecenia kontrolne 1. Wymień pozycyjne systemy liczbowe. 2. Opisz sposoby konwersji liczb heksadecymalnych na binarne i binarnych na heksadecymalne. 3. Co to jest tabliczka dodawania i odejmowania liczb binarnych? 4. Jakie niedoskonałości skrywa metoda znak-moduł? 5. Jakie niebezpieczeństwo pojawia się przy zaokrąglaniu binarnych liczb zmiennoprzecinkowych? 59 urzadzenia_techniki_komputerowej.indb 59 2010-06-01 11:02:29