Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne 1. Bit Pozycja rejestru lub komórki pamięci służąca do przedstawiania (pamiętania) cyfry w systemie (liczbowym) dwójkowym. Może przyjmować dwa stany 0 lub 1. 3. Bajt Ciąg ośmiu bitów, stanowiący najmniejszą adresowalną porcję informacji, przechowującą jeden znak alfanumeryczny lub liczbę z zakresu 0-255. 2.Słowo Ciąg bitów, stanowiących porcję danych. Ustalona dla danego komputera (procesora) pojemność komórki pamięci (rejestru). Najczęściej słowo jest wielokrotnością bajtu. Konwersja systemów liczbowych dzielenie przez podstawę dodawanie i odejmowanie potęg 2 Operacje przesunięcia i obracania związek z mnożeniem i dzieleniem przez 2 Zapis liczb w NKB Dodawanie przeniesienie Odejmowanie - pożyczka Mnożenie 5x6=30 0000 0101 0110 dodaj 6 0110 i przesuń w prawo 0110 0101 0011 0010 dodaj 0 0000 i przesuń w prawo 0011 0010 0001 1001 dodaj 6 0110
i przesuń w prawo 0111 1001 0011 1100 dodaj 0 0000 i przesuń w prawo 0011 1100 0001 1110 Liczby ułamkowe stałopozycyjne 0011,0101 = 3 i 5/16 Kod uzupełnień do 2 (U2) W dwójkowym systemie liczbowym najstarszy bit liczby n-cyfrowej ma wagę 2 n 1. Jedyną różnicą, jaką wprowadza tu kod U2, jest zmiana wagi tego bitu na przeciwną ( 2 n 1 ). Wartość dziesiętną liczby U2 wyraża wzór: Najstarszy bit koduje wartość liczby, ale jest też nazywany bitem znaku, ponieważ świadczy o znaku liczby: jeśli jest ustawiony (=1), to liczba jest ujemna, jeśli jest skasowany (=0), to liczba jest dodatnia lub równa 0. Zwiększając obszar zajmowany przez liczbę w kodzie U2 (np. z jednego bajta na dwa), dodawany obszar wypełnia się bitem znaku. Kod U2 jest może być również użyty do przechowywania liczb ułamkowych o stałej pozycji przecinka. Zapisywany jest wówczas licznik ułamka o mianowniku będącym potęgą liczby dwa (2 n, np. 2, 4, 8,...), mianownik nie jest zapisywany. Przy mnożeniu i dzieleniu takich liczb wymagane są korekty, jeśli wynik ma mieć przecinek w tym samym miejscu. Tworzenie liczby ujemnej U2: negacja dodanie 1 Dodawanie w U2 normalnie Odejmowanie w U2 dodawanie liczby przeciwnej Dodawanie i odejmowanie liczb U2 Dodawanie i odejmowanie w U2 odbywa się standardową metodą traktujemy liczby jako zwykłe liczby binarne (dodatnie), dodajemy je i odejmujemy, a wynik otrzymamy w kodzie U2. Dodawanie i odejmowanie odbywa się łącznie z bitem znaku. Jeśli przeniesienie (lub pożyczka dla odejmowania) wystąpi tylko na bit znaku albo poza niego (nie jednocześnie lub wcale), wówczas mamy do czynienia z przepełnieniem. Oznacza to że wynik nie mieści się w kodowanym zakresie.
Przykład W precyzji do części czwartych, w ośmiobitowej reprezentacji, liczby są kodowane: Dodawanie +11100010 -------- 110110011 Dziewiąty bit wyniku jest odrzucany przy określaniu liczby (jest on używany tylko do określenia czy nastąpiło przepełnienie). Tu wystąpiło przeniesienie na bit znaku i z niego, dlatego przepełnienie nie wystąpiło wynik nie przekroczył zakresu i jest poprawny. Odejmowanie Odejmowanie jest realizowane, jak odejmowanie w naturalnym kodzie dwójkowym. Przykład z reprezentacją do części czwartych: 11100010 -------- 111101111 Odejmowanie może być zamienione na dodanie liczby przeciwnej, Powyższe działanie realizowane jako wzięcie liczby przeciwnej i dodawanie przeciwna do 11100010 = 00011110 +00011110 ------------ 11101111
Liczby zmiennoprzecinkowe 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 1. Mantysa należy do przedziału [1,2), jest więc postaci 1.xxxxx... (x bit o dowolnej wartości). Ponieważ część całkowita jest znana, i równa zawsze 1, przeto nie jest zapamiętywana, co daje dodatkowy bit na część ułamkową. 2. Ponieważ znak liczby jest zapamiętywany na jednym bicie, przeto otrzymanie modułu i wartości przeciwnej wymaga, odpowiednio, wyzerowania tego bitu (logiczna operacja AND), lub zmiany na wartość przeciwną (logiczna operacja XOR). Przykład 1 0 0100 0100 111 1100 1010 0010 0111 1100 = 1,111110010100 01001111100*2 59 = 1 *1,8168060 *2 59 znak s (1 bit) = 0 (liczba dodatnia) wykładnik E (8 bit) = 0100 0100 = 68-127= -59 (odejmujemy 127, bo kod z przesunięciem 2 k-1-1) M = 1,111 1100 1010 0010 0111 1100 2 = 1,8168060 10 Dodajemy 1 z przecinkiem bo ją pominięto w zapisie mantysy 1 0100 0100 111 1100 1010 0010 0111 1100 = 1,11111001010 001001111100*2 59 = 1 *1,8168060 *2 59 s (1 bit) = 1 (liczba ujemna) E (8 bit) = 0100 0100 = 68-127= -59 M = 1,111 1100 1010 0010 0111 1100 2 = 1,8168060 10 0 0111 1111 000 0000 0000 0000 0000 0000 = 1 * 1,0 * 2 0 = 1 s (1 bit) = 0 (liczba dodatnia) E (8 bit) = 0111 1111 = 127-127 = 0
M = 1,000 0000 0000 0000 0000 0000 2 = 1,0 10 Dodawanie i odejmowanie Załóżmy że chcemy dodać lub odjąć dwie dodatnie liczby zmiennoprzecinkowe: oraz, przy czym. Mnożenie i dzielenie Mając dane liczby zmiennoprzecinkowe i : Zadania i problemy: 1. Przedstaw w naturalnym kodzie binarnym następujące liczby dziesiętne: 25, 55, 125, 625 2. Przedstaw w systemie szesnastkowym następujące liczby dziesiętne: 25, 55, 125, 625 3. Wykonaj następujące operacje logiczne na liczbach 8 bitowych: NOT 25, 55 AND 25, 34 OR 71, 187 XOR 21, 32 NAND 23, 76 NOR 136, 4. Przedstaw w systemie stałoprzecinkowym (8 bitów, po 4 na część całkowitą i ułamkową) następujące liczby: 21/16, 18/4, 3/8, 15/2 5. Przedstaw w kodzie U2 (8bit) następujące liczby całkowite: - 100, 59, -25, -89 6. Przedstaw w kodzie U2 stałoprzecinkowym (8 bitów, po 4 bity na część ułamkową) następujące liczby: -1/16, -10/4, 3/8, -5/2 7. Wykonaj dodawanie następujących liczb w kodzie U2: 50+60, -21+35, 8. Wykonaj odejmowanie następujących liczb w kodzie U2: 20-31, 17-8 9. Wykonaj mnożenie i dzielenie liczb binarnych za pomocą przesuwania: 17*4, 11*8, 54/2, 67/16 10. Wykonaj mnożenie następujących liczb binarnych: 7*5, 11*8 11. Wykonaj dzielenie następujących liczb binarnych: 45/9, 23/4 12. Dane są liczby w formacie zmiennoprzecinkowym pojedynczej precyzji (32bit), przedstaw je w postaci dziesiętnej: a. 01000010110010000000000000000000, b. 11000011111010000000000000000000