Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Zmodyfikowano 29.01.2024

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Matura - programowanie w C++

Liczby całkowite

SPIS TREŚCI

Naturalny system dwójkowy

Komputer jest maszyną liczącą. Dlatego wiedza na temat komputerowych sposobów liczenia jest bardzo istotna w informatyce. Zaczniemy od podstawowego systemu, który nosi nazwę Naturalnego Systemu Binarnego/Dwójkowego (ang. Natural Binary System, NBS). Z poprzednich zajęć wiesz, iż komputer przetwarza jedynie bity, które dla wygody zapisujemy cyframi 0 lub 1. Zatem liczby przetwarzane przez komputer muszą być zbudowane tylko z bitów. System NBS jest systemem pozycyjnym o podstawie p = 2, posiada tylko 2 cyfry 0 i 1, które idealnie pasują do bitów.

Dane komputer składuje w pamięci (ang. memory), czyli urządzeniu przechowującym bity. Pamięć jest podzielona na komórki (ang. cells), do których ma dostęp procesor komputera. W każdej komórce można przechować 8 bitów informacji:

Postąpiono tak z powodów ekonomicznych – bit jest bardzo małą jednostką informacji. 8 bitów tworzy bajt (ang. byte). Jeśli w bajcie zapiszemy liczbę NBS, to poszczególne bity będą miały wagi:

Waga:
128
64
32
16
8
4
2
1
Bit:
b7
b6
b5
b4
b3
b2
b1
b0

Powyższa tabelka pozwala nam w prosty sposób wyliczać wartość jednobajtowej liczby NBS (sumujemy wagi tych bitów, które mają wartość 1):

Waga:
128
64
32
16
8
4
2
1
Bit:
1
1
0
0
0
1
1
1
= 128 + 64 + 4 + 2 + 1
= 199(10)
Waga: 
128
64
32
16
8
4
2
1
Bit: 
0
0
1
1
1
0
0
0
= 32 + 16 + 8
= 56(10)

Tutaj musimy wyliczać wagi pozycji, co przy większej liczbie bitów jest niewygodne. Dlatego częściej stosujemy tzw. schemat Hornera. Algorytm jest następujący:

wejście: ciąg cyfr dwójkowych reprezentujący liczbę dwójkową NBS
wyjście: W = wartość liczby

Lista kroków:

K01: W ← 0
K02: Dopóki są nieprzetworzone cyfry liczby,
     wykonuj kroki K03...K04
K03:    c ← kolejna cyfra liczby
K04:    W ← W + W + c
K05: Pisz W
K06: Zakończ

Pseudokod:

W ← 0
dopóki istnieją nieprzetworzone cyfry,
wykonuj:
    czytaj kolejną cyfrę do c
    W ← W + W + c
wypisz W

Schemat blokowy:

Z powyższego algorytmu korzysta się w programach, dlatego warto go zapamiętać. Zobaczmy, jak on działa:

L(2) = 10111101
 
W = 0
Bierzemy kolejne cyfry liczby:
10111101
W = 2 × 0 + 1 = 1
10111101
W = 2 × 1 + 0 = 2
10111101
W = 2 × 2 + 1 = 5
10111101
W = 2 × 5 + 1 = 11
10111101
W = 2 × 11 + 1 = 23
10111101
W = 2 × 23 + 1 = 47
10111101
W = 2 × 47 + 0 = 94
10111101
W = 2 × 94 + 1 = 189
10111101
Koniec cyfr, W = 189

Dla wprawy oblicz tym algorytmem wartości liczb dwójkowych NBS:

10101010(2) = ?
11100001(2) = ?
1110001110111111(2) = ?

Ilość bitów liczby nie ma tutaj znaczenia.

Rozwiążmy teraz następujący problem. Mamy n-bitową liczbę dwójkową w kodzie NBS. Jaki jest zakres wartości, które ta liczba może reprezentować?

Najmniejsza wartość jest bardzo prosta, ponieważ wszystkie bity liczby muszą być zerami (dlaczego?), zatem

A największa? Skorzystajmy ze wzoru na wartość liczby NBS:

bn-1bn-2...b2b1b0 = bn-12n-1 + bn-22n-2 + ... + b222 + b121 + b020

Aby suma ta była największa, muszą w niej wystąpić wszystkie wagi pozycji, a to oznacza, iż wszystkie bity muszą być jedynkami (dlaczego?), zatem

Tutaj nie jest tak prosto jak z zerami. Ile wynosi wartość n-bitowej liczby NBS, której wszystkie bity są jedynkami? Zróbmy to tak:

n = 1
Lmax = 1(2) = 1
n = 2
Lmax = 11(2) = 3
n = 3
Lmax = 111(2) = 7
n = 4
Lmax = 1111(2) = 15
...
...

Widzisz już prawidłowość? Zwróć uwagę, iż otrzymane liczby, to wartości następnej wagi pozycji przed najstarszą cyfrą minus 1:

n = 1
Lmax = 211(2)
=
  1 =
 2 - 1
n = 2
Lmax = 41211(2)
=
  3 =
 4 - 1
n = 3
Lmax = 8141211(2)
=
  7 =
 8 - 1
n = 4
Lmax = 1618141211(2)
=
 15 =
16 - 1

Idźmy dalej i zapiszmy wagę następnej pozycji przed najstarszą cyfrą jako potęgę liczby 2:

n = 1
Lmax = 211(2)
=
 
 1 =
 2 - 1
= 21 - 1
n = 2
Lmax = 41211(2)
=
 
 3 =
 4 - 1
= 22 - 1
n = 3
Lmax = 8141211(2)
=
 
 7 =
 8 - 1
= 23 - 1
n = 4
Lmax = 1618141211(2)
=
 
15 =
16 - 1
= 24 - 1

Teraz porównaj liczbę bitów n z wykładnikami potęg 2, to jest ta sama wartość. Zatem największa wartość n-bitowej liczby NBS wynosi:

Stąd n-bitowe liczby NBS posiadają zakres od 0 do 2n - 1.

Zapamiętaj dobrze ten wzór. Wartości minimalna i maksymalna określają zakres liczb, które może reprezentować n-bitowa liczba NBS. Dla przykładu policzmy zakresy kilku wybranych liczb NBS:

n =  4, zakres od 0 do 2 4 - 1, czyli od 0 do 15
n =  8, zakres od 0 do 2 8 - 1, czyli od 0 do 255
n = 16, zakres od 0 do 216 - 1, czyli od 0 do 65535

Teraz twoja kolej (nie licz ręcznie, użyj kalkulatora):

n = 32, zakres od 0 do ..., czyli od 0 do ...
n = 64, zakres od 0 do ..., czyli od 0 do ...

Po co nam jest potrzebna znajomość zakresu? Gdy będziemy wykonywać obliczenia na komputerze, musimy wiedzieć, czy wynik zmieści się w zakresie używanych przez nas liczb. Wrócimy do tego przy programowaniu.

Do zapamiętania:

Dla ambitnych:

Jak zmienić algorytm schematu Hornera, aby obliczać wartość liczby pozycyjnej o dowolnej podstawie p?
Na przykład:<>

p = 4, 123221034 = ?

Jak przekształcić wzór na zakres liczb n-bitowych NBS, aby obliczać zakres n-cyfrowych liczb przy dowolnej podstawie p > 1 ?


Na początek:  podrozdziału   strony 

Przeliczanie DEC → NBS

Wiemy jak policzyć wartość dowolnej liczby NBS (najszybszy sposób to  kalkulator z trybem programisty, a gdy go brak to schemat Hornera). Jak jednak przeliczyć daną liczbę dziesiętną na jej odpowiednik w NBS?

Zaczniemy od sposobu bezpośredniego. Załóżmy, że mamy znaleźć zapis 8-bitowej liczby NBS o wartości 189. Jak się do tego zabrać? Najpierw utwórzmy tabelkę z wagami 8-bitowej liczby NBS:

Waga
128
64
32
16
8
4
2
1
Cyfra

Cyfr będziemy szukać od najstarszej, do najmłodszej. Najstarsza cyfra ma wartość 1, jeśli waga jej pozycji mieści się w liczbie, czyli:

128 189

Warunek spełniony, zatem najstarsza cyfra ma wartość 1:

Waga
128
64
32
16
8
4
2
1
Cyfra
1

Wagę 128 musimy odjąć, od liczby:

189 - 128 = 61

Otrzymaliśmy nową wartość 61 – to wartość pozostałych cyfr liczby NBS. Kolejna waga 64 nie spełnia warunku:

64 ≤ 61

Zatem ta waga nie dodaje się do wartości liczby, cyfra na tej pozycji musi mieć wartość 0:

Waga
128
64
32
16
8
4
2
1
Cyfra
1
0

Bierzemy następną wagę 32:

32 ≤ 61

Warunek spełniony, cyfra 1:

Waga
128
64
32
16
8
4
2
1
Cyfra
1
0
1

Obliczamy wartość pozostałych cyfr NBS:

61 - 32 = 29

Sprawdzamy dalej:

16 ≤ 29 → 1
Waga
128
64
32
16
8
4
2
1
Cyfra
1
0
1
1
29 - 16 = 13
8 ≤ 13 → 1
Waga
128
64
32
16
8
4
2
1
Cyfra
1
0
1
1
1
13 - 8 = 5
4 ≤ 5 → 1
Waga
128
64
32
16
8
4
2
1
Cyfra
1
0
1
1
1
1
5 - 4 = 1
2 ≤ 1 → 0
Waga
128
64
32
16
8
4
2
1
Cyfra
1
0
1
1
1
1
0
1 ≤ 1 → 1
Waga
128
64
32
16
8
4
2
1
Cyfra
1
0
1
1
1
1
0
1

Mamy wszystkie cyfry, zatem:

189(10) = 10111101(NBS)

Dla większych liczb sposób ten nie jest wygodny. Stosujemy wtedy algorytm ogólny. Wyprowadzimy go ze wzoru na wartość liczby NBS. Aby uprościć obliczenia załóżmy, iż mamy 4-bitową liczbę NBS (wyniki można później uogólnić na liczbę o dowolnej liczbie bitów):

Co się stanie, gdy podzielimy z resztą tę wartość przez 2 (czyli przez podstawę systemu):

Zwróć uwagę, iż po podzieleniu liczby przez podstawę otrzymujemy liczbę z cyframi przesuniętymi o jedną pozycję w prawo, a jako resztę otrzymamy ostatnią cyfrę. Tak samo jest w każdym systemie pozycyjnym, np. w dziesiętnym:

Powtarzając tę operację z wynikiem dzielenia otrzymamy kolejną od końca cyfrę liczby. Operację kontynuujemy aż do wyzerowania wartości liczby. Dla przykładu przeliczmy w ten sposób liczbę 203 na NBC:

Operacja Wynik Reszta
203 : 2 =
101
1
101 : 2 =
 50
1
 50 : 2 =
 25
0
 25 : 2 =
 12
1
 12 : 2 =
  6
0
  6 : 2 =
  3
0
  3 : 2 =
  1
1
  1 : 2 =
  0
1

Otrzymaliśmy cyfry w kolejności od końca liczby, zatem musimy je zapisać w odwrotnym kierunku (od dołu do góry):

203(10) = 11001011(NBS)

Zapiszmy teraz algorytm przeliczania całkowitej liczby dziesiętnej (nieujemnej) na liczbę NBS:

wejście: L całkowita liczba nieujemna
wyjście: zapis w odwrotnym kierunku liczby L w kodzie NBS

Lista kroków:

K01: Pisz (L mod 2)
K02: L ← L div 2
K03: Jeśli L > 0,
     to idź do kroku K01
K04: Zakończ

Pseudokod:

powtarzaj
    pisz L mod 2
    L ← L div 2
aż do L = 0

Operacja mod (czytaj modulo) daje resztę z dzielenia całkowitego. Operacja div oznacza dzielenie całkowite.

Schemat blokowy:

Zadanie:

Wykorzystując podany algorytm, przelicz na NBS liczby: 100, 1000, 10000.

Zadanie dla ambitnych:

Co należy zmienić w podanym algorytmie, aby przeliczać liczby dziesiętne na liczbę pozycyjną o dowolnej podstawie p > 1?

Do zapamiętania:


Na początek:  podrozdziału   strony 

Dodawanie dwójkowe

W systemie dwójkowym można wykonywać dodawanie dokładnie tak samo, jak w naszym systemie dziesiętnym. Musimy jednakże nauczyć się nowej tabliczki dodawania, która jest na szczęście bardzo prosta:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 i przeniesienie 1 do następnej pozycji

 Zobaczmy jak to działa na prostym przykładzie. Dodamy dwie liczby NBS: 0011 (3) i 0101 (5).

Ustawiamy liczby jedna pod drugą tak, aby zgadzały się pozycje cyfr obu liczb:

 
0
0
1
1
 
 
3
+
0
1
0
1
 
+
5

Zgodnie z tabelką dodawania sumujemy cyfry w ostatniej kolumnie, u góry notujemy przeniesienia na czerwono:

 
 
 
1
 
 
 
 
 
0
0
1
1
 
 
3
+
0
1
0
1
 
+
5
 
 
 
 
0
 
 
 

Obie cyfry 1, zatem zapisujemy wynik 1 + 1 = 0 i w następnej kolumnie u góry wpisujemy przeniesienie 1.

 
 
1
1
 
 
 
 
 
0
0
1
1
 
 
3
+
0
1
0
1
 
+
5
 
 
 
0
0
 
 
 

Teraz sumujemy cyfry 1 i 0, dostając 1, ale musimy do tego wyniku dodać przeniesienie 1. Wynikiem jest 1 + 1 = 0 i ponowne przeniesienie do kolejnej kolumny:

 
1
1
1
 
 
 
 
 
0
0
1
1
 
 
3
+
0
1
0
1
 
+
5
 
 
0
0
0
 
 
 

Tutaj podobnie: 0 + 1 = 1, ale dodajemy przeniesienie: 1 + 1 = 0 i przeniesienie do następnej kolumny.

 
1
1
1
 
 
 
 
 
0
0
1
1
 
 
3
+
0
1
0
1
 
+
5
 
1
0
0
0
=
 
8

Ostatnie dodawanie: 0 + 0 = 0, ale musimy do wyniku dodać przeniesienie, 0 + 1 = 1.

Zwróć uwagę, iż otrzymana liczba 1000(NBS) ma wartość dziesiętną 8 (wynik dodawania jest niezależny od wybranego systemu liczbowego).

Do zapamiętania:

Zadanie:

Dla wprawy dodaj dwójkowo liczby:

0011
 
1001
 
1111
+1011
 
+0111
 
+0001

Na początek:  podrozdziału   strony 

System U2

Liczby NBS mogą jedynie być nieujemne (tzn. równe zero lub większe od zera). Jak jednak zakodować liczbę ujemną? W systemie dziesiętnym po prostu umieszczamy znak minus przed zapisem liczby: -5, -32, -125... Jednakże minus nie jest cyfrą, to dodatkowy symbol. Komputer ma do dyspozycji jedynie bity. Musimy zatem znaleźć sposób zapisu liczb ujemnych za pomocą bitów.  Rozwiązań wymyślono wiele, ale powszechnie przyjął się system zwany Kodem Uzupełnień do 2 (ang. Two's Complement), w skrócie U2.

Liczba U2 składa się zawsze z ustalonej liczby bitów. Powodem jest to, iż waga najstarszej pozycji jest zawsze ujemna. 4 bitowa liczba U2 posiada następujące wagi pozycji:

-8
4
2
1
b3
b2
b1
b0

Wartość liczby U2 obliczamy dokładnie tak samo jak liczby NBS: sumujemy wagi pozycji zawierających bit 1. Najstarszy bit zwany jest bitem znaku (ang. sign bit). Jeśli ma on wartość 0, to liczba U2 jest dodatnia. Jeśli ma wartość 1, to liczba U2 jest ujemna (dlaczego?).

Poniżej zebraliśmy wartości wszystkich 4-bitowych liczb U2:

Wagi
-8
4
2
1
 
 
0
0
0
0
=
0
=
 0
0
0
0
1
=
1
=
 1
0
0
1
0
=
2
=
 2
0
0
1
1
=
2+1
=
 3
0
1
0
0
=
4
=
 4
0
1
0
1
=
4+1
=
 5
0
1
1
0
=
4+2
=
 6
0
1
1
1
=
4+2+1 
=
 7
1
0
0
0
=
-8
=
-8
1
0
0
1
=
-8+1
=
-7
1
0
1
0
=
-8+2
=
-6
1
0
1
1
=
-8+2+1
=
-5
1
1
0
0
=
-8+4
=
-4
1
1
0
1
=
-8+4+1
=
-3
1
1
1
0
=
-8+4+2
=
-2
1
1
1
1
=
-8+4+2+1
=
-1

Na pierwszy rzut oka wygląda to dziwnie. Jeśli jednak przyjrzysz się dokładnie liczbie U2, to zauważysz, iż składa się ona jakby z dwóch części: pierwsza obejmuje bit znaku, druga jest zwykłą liczbą NBS:

Jeśli liczba U2 składa się z n bitów, to bit znaku jest zawsze na pozycji o numerze n - 1 (pozycje numerujemy od 0):

Ponieważ wagi pozycji są potęgami podstawy 2 o wykładniku równym numerowi pozycji, to pozycja bitu znakowego ma wagę -2n - 1. Zatem wartość n-bitowej liczby U2 wynosi:

Wzór jest dwuczęściowy. Na czerwono zaznaczono wartość części znakowej. Jeśli bit znaku bn-1 ma wartość 0, to część znakowa jest równa 0. Jeśli bit znakowy bn-1 ma wartość 1, to część znakowa jest równa wadze pozycji znakowej, czyli -2n-1. Druga część wzoru określa wartość pozostałych bitów liczby U2. Zwróć uwagę, iż jest to zwykła liczba NBS (n-1)-bitowa, którą sumujemy z częścią znakową. Daje nam to wskazówkę, jak obliczać wartość liczby U2: Obliczamy część znakową, obliczamy część NBS i sumujemy wyniki.

Przykład:

Obliczyć wartość liczby U2:

11110110U2 = ?

Liczymy bity liczby: jest ich 8. Zatem najstarsza pozycja ma wagę:

-28-1 = -27 = -128.

Bit znaku ma wartość 1, zatem część znakowa ma wartość:

-128.

Pozostała część liczby jest zwykłą liczbą NBS. Obliczamy jej wartość przy pomocy schematu Hornera:

L = 1110110
 
W = 0
Bierzemy kolejne cyfry liczby:
1110110
W = 2 ×  0 + 1 =   1
1110110
W = 2 ×  1 + 1 =   3
1110110
W = 2 ×  3 + 1 =   7
1110110
W = 2 ×  7 + 0 =  14
1110110
W = 2 × 14 + 1 =  29
1110110
W = 2 × 29 + 1 =  59
1110110
W = 2 × 59 + 0 = 118

Sumujemy obie części i otrzymujemy wartość liczby U2:

11110110U2 = -128 + 118 = -10

Określimy teraz zakres n-bitowych liczb U2.

Największa wartość U2 nie może być ujemna, zatem bit znaku musi mieć wartość 0. Pozostałe bity tworzą wartość dodatnią NBS. Bitów tych jest n - 1. Największa wartość NBS powstanie wtedy, gdy wszystkie bity liczby będą miały wartość 1:

Korzystamy tutaj ze wzoru na wartość maksymalną liczby NBS, który wyprowadziliśmy wcześniej:

Dla n bitów LNBSmax = 2n - 1
Dla n - 1 bitów LNBSmax = 2n-1 - 1

Najmniejsza wartość U2 będzie wtedy, gdy bit znakowy przyjmie wartość 1, a wszystkie pozostałe bity będą miały wartość 0 (dlaczego?):

W takim przypadku wartość liczby U2 będzie równa wartości pozycji znakowej, czyli -2n-1. Łączymy te wyniki i otrzymujemy:

Zakres n-bitowych liczb U2 rozciąga się od -2n-1 do 2n-1 - 1.

Zwróć uwagę, iż zakres liczb U2 nie jest symetryczny, jednakże mieści dokładnie 2n różnych liczb (sprawdź to). Policzmy zakresy wybranych liczb U2:

n =  4, zakres U2: od -2 4 - 1 do 2 4 - 1 - 1, czyli od -8 do 7
n =  8, zakres U2: od -2 8 - 1 do 2 8 - 1 - 1, czyli od -128 do 127
n = 16, zakres U2: od -216 - 1 do 216 - 1 - 1, czyli od -32768 do 32767

Teraz twoja kolej (użyj kalkulatora):

n = 32, zakres U2:
n = 64, zakres U2:

Jest jeszcze jedna ciekawa rzecz: na przykładzie kodów NBS i U2 widać wyraźnie, iż informacja reprezentowana przez bity zależy od ich interpretacji. Poniższa tabelka przedstawia wartości 4-bitowych liczb NBS i U2:

  Wartość
Kod jako
NBS
jako
U2
0000
 0
 0
0001
 1
 1
0010
 2
 2
0011
 3
 3
0100
 4
 4
0101
 5
 5
0110
 6
 6
0111
 7
 7
1000
 8
-8
1001
 9
-7
1010
10
-6
1011
11
-5
1100
12
-4
1101
13
-3
1110
14
-2
1111
15
-1

Do zapamiętania:


Na początek:  podrozdziału   strony 

Przeliczanie DEC → U2

Liczba U2 zawsze składa się z ustalonej liczby bitów. Jeśli chcemy zwiększyć liczbę bitów liczby U2, to postępujemy następująco:

Do wszystkich nowododanych bitów kopiujemy bit znakowy.

Przykład 1:

Mamy liczbę 0110U2 i chcemy rozszerzyć ją na 8 bitów.  Bit znakowy ma stan 0, zatem dopisujemy na początku 4 bity 0:

0110U20000 0110U200000110U2

Sprawdź, że nowa liczba ma tę samą wartość co poprzednia.

Przykład 2:

Mamy liczbę 1110U2 i chcemy rozszerzyć ją na 8 bitów.  Bit znakowy wynosi teraz 1, zatem dopisujemy do liczby 4 bity 1:

1110U2 1111 1110U211111110U2

Sprawdź, że nowa liczba ma tę samą wartość co poprzednia


Aby znaleźć liczbę U2 przeciwną do danej liczby U2, postępujemy następująco:

Rozpoczynamy od najmłodszego bitu danej liczby i będziemy się przesuwać w lewo. Do liczby przeciwnej kopiujemy wszystkie napotkane bity 0, aż dojdziemy do bitu 1, który też kopiujemy. Wszystkie pozostałe bity kopiujemy zamieniając je na bit przeciwny (0 → 1; 1 → 0).

Przykład:

Znaleźć liczbę U2 przeciwną do danej 00111010100U2.

1. Kopiujemy bity 0 i pierwszy bit 1:
00111010100
        100

2. Kopiujemy pozostałe bity zamieniając je na przeciwne:

00111010100
11000101100

Otrzymaliśmy wynik 11000101100U2.

Sprawdźmy, czy wynik jest prawidłowy. Najpierw liczymy wartość pierwszej liczby (pomijamy bit znaku równy 0, liczba jest dodatnia):

L1 = 00111010100U2
L = 0111010100
 
W = 0
0111010100
W = 2 × 0 + 0 = 0
0111010100
W = 2 × 0 + 1 = 1
0111010100
W = 2 × 1 + 1 = 3
0111010100
W = 2 × 3 + 1 = 7
0111010100
W = 2 × 7 + 0 = 14
0111010100
W = 2 × 14 + 1 = 29
0111010100
W = 2 × 29 + 0 = 58
0111010100
W = 2 × 58 + 1 = 117
0111010100
W = 2 × 117 + 0 = 234
0111010100
W = 2 × 234 + 0 = 468
L1 = 468
L2 = 11000101100U2

Bit znakowy jest równy 1, jest to zatem liczba ujemna.

Obliczamy wagę pozycji znakowej: w = -210 = -1024.

Obliczamy wartość pozostałych bitów liczby:

L =1000101100
 
W = 0
1000101100
W = 2 ×   0 + 1 =   1
1000101100
W = 2 ×   1 + 0 =   2
1000101100
W = 2 ×   2 + 0 =   4
1000101100
W = 2 ×   4 + 0 =   8
1000101100
W = 2 ×   8 + 1 =  17
1000101100
W = 2 ×  17 + 0 =  34
1000101100
W = 2 ×  34 + 1 =  69
1000101100
W = 2 ×  69 + 1 = 139
1000101100
W = 2 × 139 + 0 = 278
1000101100
W = 2 × 278 + 0 = 556

Sumujemy część znakową z wartością pozostałych bitów:

L2 = -1024 + 556 = -468 = -L1

Zwróć uwagę, iż taki sposób znajdowania liczby przeciwnej nie wymaga żadnych obliczeń, dlatego warto go zapamiętać.


Jeśli chcemy przeliczyć wartość dziesiętną na liczbę U2 postępujemy następująco:

Przypadek 1: przeliczana liczba jest nieujemna

Bit znakowy będzie równy 0, a reszta bitów to liczba NBS o wartości przeliczanej liczby. Wyznaczamy zatem liczbę NBS i rozszerzamy do formatu liczby U2 dodając bity 0 w miarę potrzeb.

Przykład:

Przeliczyć liczbę 100(10) na 8-bitową liczbę U2.

Wyznaczamy liczbę NBS o wartości 100:

Operacja Wynik Reszta
100 : 2
 50
 0
 50 : 2
 25
 0
 25 : 2
 12
 1
 12 : 2
  6
 0
  6 : 2
  3
 0
  3 : 2
  1
 1
  1 : 2
  0
 1

Otrzymujemy liczbę 1100100NBS. Rozszerzamy do 8 bitów: 100(10) = 01100100U2.

Przypadek 2: Przeliczana liczba jest ujemna

Bit znakowy będzie równy 1. Wartość pozycji znakowej będzie równa z = -2n-1, gdzie n oznacza ilość bitów liczby U2. Naszym zadaniem jest znalezienie pozostałych bitów liczby U2. Korzystamy ze wzoru na wartość liczby U2:

LU2 = z + L

Gdzie:
LU2 – wartość liczby U2
z – wartość części znakowej
L – wartość pozostałych bitów liczby U2

Obliczamy L:

L = -z + LU2

Znając wartość L przeliczamy ją na liczbę NBS, wynik rozszerzamy do formatu liczby U2, dodajemy bit znakowy i mamy liczbę U2.

Przykład:

Przeliczyć -100(10) na 8-bitową liczbę U2.

Obliczamy część znakową:

z = -27 = -128

Obliczamy wartość pozostałych bitów liczby U2:

L = -z + (-100(10))
L = 128 - 100 = 28

Znajdujemy liczbę NBS wartości 28:

Operacja Wynik Reszta
28 : 2
 14
  0
14 : 2
  7
  0
 7 : 2
  3
  1
 3 : 2
  1
  1
 1 : 2
  0
  1

Otrzymujemy 11100. Uzupełniamy zerami do 7 bitów i dodajemy bit znaku:

1 00 11100 → 10011100U2 = -100(10).

Więcej na ten temat znajdziesz w artykule "Przeliczanie liczb dziesiętnych na liczby U2".

Do zapamiętania:


Na początek:  podrozdziału   strony 

Dodawanie liczb U2

Teraz wyjaśnimy, dlaczego wybrano format U2 do reprezentacji liczb całkowitych (dodatnich, ujemnych i zera). Powodem było to, iż liczby U2 można dodawać wg tych samych zasad co liczby NBS. Dzięki temu mikroprocesor wykorzystuje te same układy arytmetyczne dla obu formatów, co w efekcie upraszcza jego konstrukcję oraz koszt. Różnica polega na odmiennej interpretacji wyniku. Istnieją tutaj specjalne przypadki, jednak nie będziemy zaprzątać ci nimi głowy (jeśli cię to interesuje, przeczytaj podany wcześniej artykuł). Podamy jedynie prosty przykład: mamy dodać dwie 4-bitowe liczby U2:

L1 = 0111U2 =  7 ( 4 + 2 + 1)
L2 = 1101U2 = -3 (-8 + 4 + 1)
 
0
1
1
1
 
 
  7  
+
1
1
0
1
 
+
(-3)
1
1
1
1
 
 
 
 
 
0
1
1
1
 
 
  7  
+
1
1
0
1
 
+
(-3)
 
0
1
0
0
 
 
  4  

Ignorujemy przeniesienie poza bit znaku (to jeden z tych przypadków). Otrzymaliśmy poprawny wynik. Aby wynik był poprawny, musi się mieścić w zakresie używanych liczb U2. Dokładniej pomówimy o tym przy programowaniu.

Do zapamiętania:


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.