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: a
n-1
a
n-2
…a
1
a
0
jest interpretowany jako liczba całkowita bez znaku o wartości A
obliczanej wg wzoru:
Np. ciąg binarny 10101010:
2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
0
1 0 1 0 1 0 1 0
Reprezentuje liczbę o wartości:
128 + 0 + 32 + 0 + 8 + 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 2
n
- 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= 2
n
-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ę 2
n
-1
1
0
2
n
=
i
i
i
a
=
A
2
n
-a= ~a + 1
- oznacza to, że aby uzyskad kod liczby ujemnej (2
n
-a), należy zanegowad
każdy bit liczby a i dodad „1”
kod U2 (a)= a ;
a>=0
kod U2 (a)= ~a + 1;
a<0
Np. dla kodu 8-bitowego:
kodU2(5) = 00000101
kodU2(-5)= 11111011
Dla liczby a będącej ciągiem cyfr binarnych: a
n-1
a
n-2
…a
1
a
0
jej wartośd dziesiętna wyraża się
wzorem:
Przykład:
Rozważmy liczbę binarną liczba=10010011
-2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
0
-128 64 32 16 8 4 2 1
1 0 0 1 0 0 1 1
Liczba=-128+16+2+1=-109
A teraz sprawdzenie: zapiszmy liczbę dziesiętną -109 w kodzie U2:
109
1
54
0
27
1
01101101 -> 10010010 + 1 = 10010011
13
1
6
0
wartośd binarna
3
1
liczby 109
negacja bitowa
1
1
0
0
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.
2
0
1
1
2
2
n
=
i
i
i
n
n
a
+
a
=
a
Przykład:
Zamieomy liczbę -109
1. 109
10
= 01101101
2
2. 0 1 1 0 1 1 0 1
zamiana
pozostaje niezmieniona
1 0 0 1 0 0 1 1
Przykład:
Sprawdzenie co to za liczba: 1111111110011010:
Przeciwnie do zamiany na liczbę ujemną
1111111110011001
(l-1) - odjęcie „1”
0000000001100110
(~l) - negacja
wynik: liczba 102
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
ostatnie 2 bity pozostają bez zmian
0000000011001
10
pozostałe bity zostają zamienione na przeciwne
Kod z nadmiarem 2
n-1
Każda liczba jest „przesunięta do przodu” o pewną stałą nazywaną BIAS (biased exponent
).
Może to byd
wartośd 2
n-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 2
n-1
czyli 2
7
= 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
dziesiętna
Znak-moduł
U1
U2
Nadmiar
128
10
00001010
00001010
00001010
10001010
7
00000111
00000111
00000111
10000111
3
00000011
00000011
00000011
00000011
0
00000000
00000000
00000000
10000000
-0
10000000
01111111
-
-
-3
10000011
11111100
11111101
01111101
-7
10000111
11111000
11111001
01111001
-10
10001010
11110101
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