Reprezentacja liczb całkowitych w komputerze. Do przechowywania i przetwarzania liczb w komputerze używany jest system binarny. 8-bitowe słowo mogłoby reprezentowad liczbę całkowitą z przedziału <0;255>. n-bitowy ciąg: an-1an-2 …a1 a0 jest interpretowany jako liczba całkowita bez znaku o wartości A obliczanej wg wzoru: n 1 A = 2i ai i=0 Np. ciąg binarny 10101010: 27 26 25 24 23 2 2 21 1 0 1 0 1 0 1 Reprezentuje liczbę o wartości: 128 + 0 + 32 + 0 + 8 + 0 + 20 0 2 + 0 = 170 Taki sposób reprezentacji nie pozwala na zapis liczb ujemnych. Istnieją cztery sposoby reprezentacji liczb całkowitych niedodatnich: Reprezentacja znak-moduł (signed magnitude) Najbardziej znaczący bit - znak liczby: 0 – liczba dodatnia, 1 – liczba ujemna Pozostałe bity – wartośd bezwzględna liczby Np. dla kodu 8-bitowego: kod znak-moduł(5) = 00000101 kod znak-moduł(-5)= 10000101 Kod uzupełnienia do 1 (U1) Liczba przeciwna (zmiana znaku) – zanegowane wszystkie bity (uzupełnienie do 1) Np. dla kodu 8-bitowego: kodU1(5) = 00000101 kodU1(-5)= 11111010 Kod uzupełnienia do 2 (U2) Dla n-bitowej liczby ujemnej (–a) jej kod wynosi 2n - a Praktyczny sposób kodowania liczby ujemnej polega na zanegowaniu wszystkich bitów i dodaniu wartości „1”. Wynika to z następujących równości: a + ~a= 2n-1 - dodając liczbę binarną a o n cyfrach i liczbę uzyskaną poprzez zanegowanie każdego z jej bitów uzyskujemy na każdej z n pozycji wartośd „1” , czyli liczbę 2n-1 2n-a= ~a + 1 - oznacza to, że aby uzyskad kod liczby ujemnej (2n-a), należy zanegowad każdy bit liczby a i dodad „1” kod U2 (a)= a ; kod U2 (a)= ~a + 1; a>=0 a<0 Np. dla kodu 8-bitowego: kodU2(5) = 00000101 kodU2(-5)= 11111011 Dla liczby a będącej ciągiem cyfr binarnych: an-1an-2 …a1 a0 jej wartośd dziesiętna wyraża się wzorem: n 2 a = 2 n 1 an 1 + 2i ai i=0 Przykład: Rozważmy liczbę binarną liczba=10010011 -27 26 -128 64 1 0 25 2 4 32 16 0 1 23 8 0 22 4 0 21 2 1 20 1 1 Liczba=-128+16+2+1=-109 A teraz sprawdzenie: zapiszmy liczbę dziesiętną -109 w kodzie U2: 109 54 27 13 6 3 1 0 1 0 1 1 0 1 1 0 01101101 -> 10010010 + 1 = 10010011 wartośd binarna liczby 109 negacja bitowa Uwaga: Inny, praktyczny sposób zakodowania liczby ujemnej polega na tym, że najpierw kodujemy binarnie wartośd bezwzględną zamienianej liczby, a następnie przeglądamy uzyskaną liczbę dwójkową od pozycji o najmniejszej wadze, czyli od prawej strony i do wystąpienia pierwszej jedynki włącznie bity pozostawiamy niezmienione, następnie zamieniamy na przeciwny każdy kolejny bit. Przykład: Zamieomy liczbę -109 1. 10910 = 011011012 2. 0 1 1 0 1 1 0 1 zamiana pozostaje niezmieniona 1 0010011 Przykład: Sprawdzenie co to za liczba: 1111111110011010: Przeciwnie do zamiany na liczbę ujemną 1111111110011001 (l-1) - odjęcie „1” 0000000001100110 (~l) - negacja lub ponowna zamiana 1111111110011010 na liczbę przeciwną: 0000000001100101 (~l) - negacja 0000000001100110 (l+1) – dodanie „1” lub poprzez zamianę bitów począwszy od ostatniej „1” ………………………..10 000000001100110 wynik: liczba 102 ostatnie 2 bity pozostają bez zmian pozostałe bity zostają zamienione na przeciwne Kod z nadmiarem 2n-1 Każda liczba jest „przesunięta do przodu” o pewną stałą nazywaną BIAS (biased exponent). Może to byd wartośd 2n-1 (n -liczba bitów reprezentacji). Jej kod uzyskuje się przez dodanie tej wartości i kodowanie binarne. Mając do dyspozycji 8 bitów można zakodowad binarnie liczby z przedziału <0; 255>, natomiast korzystając z kodu z nadmiarem 2n-1 czyli 27 = 128 uzyskujemy możliwośd zakodowania liczb z przedziału <-128; 127>. Ciąg kodowy złożony z samych „0” odpowiada najmniejszej liczbie z zakresu, czyli wartości -128 (w przypadku 8 bitów i nadmiaru 128), natomiast kod złożony z samych „1” odpowiada wartości 127. Np. dla kodu 8-bitowego BIAS 128 wartości liczby 5 i -5 można policzyd w następujący sposób: kod z nadmiarem 128 (5) = kod binarny(128+5) = 10000101 kod z nadmiarem 128 (-5) = kod binarny (128-5) = kod binarny(123) = 01111011 Zarówno w reprezentacji znak-moduł, jak i w kodzie U1 występuje podwójna reprezentacja liczby 0. Problem ten nie występuje w kodzie U2 (próba zamienienia liczby 00000000 na ujemną prowadzi do uzyskania tego samego kodu: 00000000 -> 11111111 + 1 -> 00000000). Porównanie reprezentacji liczb całkowitych w 8-bitowych kodach: Liczba Znak-moduł dziesiętna 10 00001010 7 00000111 3 00000011 0 00000000 -0 10000000 -3 10000011 -7 10000111 -10 10001010 U1 U2 00001010 00000111 00000011 00000000 01111111 11111100 11111000 11110101 Nadmiar 128 00001010 10001010 00000111 10000111 00000011 00000011 00000000 10000000 11111101 01111101 11111001 01111001 11110110 01110110 Konwersja między różnymi długościami bitowymi reprezentacji Przykład: zapisanie na 16 bitach liczby 8-bitowej Znak-moduł: przesunięcie bitu znaku na pierwsza pozycję i wypełnienie „0” pozostałych pozycji: 00011010 -> 0000000000011010 liczba 26 10011010 -> 1000000000011010 liczba -26 Kod U1: wypełnienie bitem znaku dodanych pozycji: 00011010 -> 0000000000011010 liczba 26 11100101 -> 1111111111100101 liczba -26 Kod U2: wypełnienie bitem znaku dodanych pozycji: 00011010 -> 0000000000011010 liczba 26 11100110 -> 1111111111100110 liczba -26