Reprezentacja liczb całkowitych w komputerze. Do przechowywania

Transkrypt

Reprezentacja liczb całkowitych w komputerze. Do przechowywania
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