1. Historia komputera.
Narodziny komputera datuje się na 1938 rok kiedy to Konrad Zuse konstruuje w swoim mieszkaniu w Berlinie pierwszy na świecie komputer Z1 wykorzystujący nowoczesny system dwójkowy ,była to maszyna pracująca na zasadzie czysto mechanicznej. Dwa lata później na zamówienie ministerstwa lotnictwa powstaje Z3 pracujący na przekaźnikach telefonicznych. W latach 1939-1944 w USA powstaje MARK 1, pierwsza maszyna elektromechaniczna . W 1946 roku też w USA J.P. Eckert i J.W.Mauchly konstruują pierwszą w pełni elektroniczną maszynę ENIAC (17 468 lamp) wykorzystującą lampy elektronowe. Rok później J.Bardeen, W.Brattain i William Shockley opracowują pierwszy tranzystor. Była to przełomowa chwila w rozwoju maszyn liczących, które zaczęły powstawać jak grzyby po deszczu.
1948 - John van Neumann proponuje aktualną do dzisiaj architekturę komputera polegającą na umieszczeniu programu i danych w jednej pamięci jako identycznie reprezentowanych struktur. Na rynek wchodzi IBM z maszyną SSEC(12 500 lamp), a nieco później Model 604 (1 400 lamp);
1951 - konstruktorzy ENIAC'a tworzą UNIVAC 1 (5 600 lamp), pierwszy komputer produkowany seryjnie;
1952 - IBM wypuszcza komputer o szybkości mnożenia 0,4ms IBM 701;
1953 - Powstaje pamięć oparta na rdzeniach ferrytowych;
1954 - Backus i Ziller tworzą pierwszy język wyższego rzędu FORTAN, przeznaczony do obliczeń matematycznych;
1955 - Bell Telephone Labs produkuje pierwszy komputer oparty na tranzystorach;
1956 - Powstaje IBM 305, pierwszy komputer z pamięcią magnetyczną;
1958 - J.Kolby opracowuje dla Texas Instruments pierwszy układ scalony;
1959 - Powstaje język COBOL;
1961 - Texas Instruments produkuje na potrzeby armii pierwszy komputer oparty na układach scalonych z pamięcią półprzewodnikową;
1968 - R.Noyce i G.Moore zakładają firmę INTEL; D.Engelbart prezentuje NLS używający jako urządzenie wskazujące mysz;
1971 - INTEL wypuszcza pierwszy czterobitowy procesor i4004 (108khz);
1974 - ED Roberts tworzy pierwszy komputer osobisty ALTAIR; INTEL wypuszcza ośmiobitowy procesor 8080;
1975 - B.Gates i P.Allen zakładają MICROSOFT oraz opracowują język BASIC dla ALTAIR'a;
1976 - S.Woźniak i S.Jobs tworzą komputer APPLE I;
1977 - S.Woźniak i S.Jobs zakładają firmę APPLE COMPUTER oraz wypuszczają APPLE II. [5]
2. Reprezentacja liczb w różnych systemach liczbowych.
2.1. Pozycyjne systemy zapisu liczb.
Sposób zapisywania liczb nazywamy pozycyjnym, gdy wartość cyfry zależy od miejsca, czyli pozycji, jaką ta cyfra zajmuje w napisanej liczbie. Każda pozycja ma określoną i niezmienną wagę liczbową.
Postać n-cyfrowej liczby całkowitej zapisanej w systemie pozycyjnym o podstawie p jest następująca:
gdzie: ci oznacza i - tą cyfrę liczby oraz ci należy do zbioru
{0,1,2, ... ,p - 1}
Wartość tak przedstawionej liczby wynosi:
Postać m-cyfrowej liczby ułamkowej zapisanej w systemie pozycyjnym o podstawie p oraz jej wartość jest następująca:
Łącząc część całkowitą i ułamkową mamy następującą postać liczby mieszanej o n-cyfrowej części całkowitej i m-cyfrowej części ułamkowej:
Cyfry ci służą do zapisywania liczb. Są one znakami z pewnego zbioru znaków. Najczęściej są to cyfry arabskie (0 - 9) plus dodatkowe znaki w przypadku zbiorów większych od 10. [4]
|
System liczbowy |
Cyfry używane w systemie liczbowym |
2 |
Dwójkowy (binary) |
0,1 |
3 |
Trójkowy (ternary) |
0,1,2 |
8 |
Ósemkowy (octal) |
0,1,2,3,4,5,6,7 |
10 |
Dziesiętny (decimal) |
0,1,2,3,4,5,6,7,8,9 |
12 |
Dwunastkowy (duodecimal) |
0,1,2,3,4,5,6,7,8,9,α,β |
16 |
Szesnastkowy (hexadecimal) |
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F |
2.2. Dwójkowy system liczbowy.
W systemie dwójkowym p = 2. Dwójkowa liczba mieszana, składająca się z n-cyfrowej części całkowitej i m-cyfrowej części ułamkowej ma postać:
[4]
DEC |
HEX |
BIN |
DEC |
HEX |
BIN |
0 |
0 |
0000 |
8 |
8 |
1000 |
1 |
1 |
0001 |
9 |
9 |
1001 |
2 |
2 |
0010 |
10 |
A |
1010 |
3 |
3 |
0011 |
11 |
B |
1011 |
4 |
4 |
0100 |
12 |
C |
1100 |
5 |
5 |
0101 |
13 |
D |
1101 |
6 |
6 |
0110 |
14 |
E |
1110 |
7 |
7 |
0111 |
15 |
F |
1111 |
[4]
3. Bajty i bity.
Najmniejsza, liczona w bitach (bit) jednostka pamięci bezpośrednio dostępna (adresowalna) w danym systemie komputerowym. W dawniejszych systemach bajt liczył 6-9 bitów. Obecnie stosowana jest powszechnie 8-bitowa organizacja pamięci i "bajt" rozumiany jest zwykle jako 8 bitów.
Termin pochodzi od słowa "bite" (kęs), które w angielskim języku technicznym oznaczało także porcję (np. porcję danych). Aby uniknąć pomylenia ze słowem bit, inżynier Werner Buchholz w 1956 roku, zmieniając nieznacznie pisownię, przerobił "bite" na "byte". Według jego definicji bajt to "a group of bits used to encode a character, or the number of bits transmitted in parallel to and from input-output units" (grupa bitów używana do kodowania znaku lub liczba bitów przesyłanych równoległe do i z urządzeń wejściowych lub wyjściowych).
Symbolem bajta jest B (w odróżnieniu od b oznaczającego bit). Jednostki większe oznaczane są przedrostkami podobnymi do tych, jakie występują w metrycznym systemie miar (kilo-, mega-, giga-, tetra-), ale oparte są na mnożniku 1024 (2^10), a nie metrycznym tysiącu, co w systemach cyfrowych jest bardziej poręczne. Dla zaznaczenia, że nie są to jednostki metryczne, ich symbole zapisywane są za pomocą dużej litery:
kilobajt (KB) = 1024 B
megabajt (MB) = 1024 KB (1048576 B)
gigabajt (GB) = 1024 MB (103741824 B).
[5]
4. Kody.
Informacja dyskretna składa się ze znaków, którymi mogą być zarówno liczby (cyfry), litery oraz inne symbole. Znakom tym przyporządkowane są wektory informacji cyfrowej (kody dwójkowe). Długość słowa kodowego zależy od liczby znaków, które należy zakodować (np. 8 bitów daje możliwość zakodowania 256 znaków). [5]
4.1. Kody dwójkowe wagowe i niewagowe.
Jeżeli każdy bit (pozycja) kodu ma określoną i niezmienną wagę liczbową, to kod nazywamy kodem wagowym. Pozostałe kody są niewagowe. Dla kodów wagowych wartości liczbowe słowa kodowego będą sumą wag tych pozycji, które zawierają jedynki. [1]
4.2. Naturalny kod dwójkowy (binarny) - NKB
Najprostrzym wagowym kodem dwójkowym jest tzw. naturalny kod binarny - NKB. Wynika on bezpośrednio z dwójkowego systemu liczbowego. [1]
PRZYKŁAD:
DEC |
8 4 2 1 NKB |
DEC |
8 4 2 1 NKB |
0 |
0000 |
8 |
1000 |
1 |
0001 |
9 |
1001 |
2 |
0010 |
10 |
1010 |
3 |
0011 |
11 |
1011 |
4 |
0100 |
12 |
1100 |
5 |
0101 |
13 |
1101 |
6 |
0110 |
14 |
1110 |
7 |
0111 |
15 |
1111 |
4.3. Kod GRAYA.
Przykładem popularnego kodu niewagowego może być kod GRAYA
DEC |
GRAYA |
DEC |
GRAYA |
0 |
0000 |
8 |
1100 |
1 |
0001 |
9 |
1101 |
2 |
0011 |
10 |
1111 |
3 |
0010 |
11 |
1110 |
4 |
0110 |
12 |
1010 |
5 |
0111 |
13 |
1011 |
6 |
0111 |
14 |
1011 |
7 |
0100 |
15 |
1000 |
[1]
4.4. Kody dwójkowo - dziesiętne.
Ważną odmianę kodów dwójkowych stanowią kody dwójkowo-dziesiętne BCD. W kodach tych poszczególne cyfry liczby dziesiętnej przedstawiane są w kodzie dwójkowym. Wśród kodów BCD wyróżniamy wagowe i niewagowe. Najbardziej popularny jest kod BCD 8421.
PRZYKŁAD:
74910 = 7 4 9 = 011101001001BCD
0111 0100 1001
011000110010010BCD = 0011 0001 1001 0010 = 319210
3 1 9 2
[1]
4.4. Kody detekcyjne i korekcyjne.
Kody detekcyjne i korekcyjne służą do wykrywania i korekcji błędów powstałych między innymi w czasie transmisji sygnałów cyfrowych.
Z tej grupy kodów omówimy kod z kontrolą parzystości oraz kod ze stałą liczbą jedynek. [1]
4.4.1. Kody z kontrolą parzystości.
Kod z kontrolą parzystości jest tworzony przez dodanie do każdego słowa kodowego (kodu dwójkowego) dodatkowego bitu przyjmującego taką wartość, żeby liczba jedynek w słowie (łącznie z bitem parzystości) była parzysta (lub nieparzysta). Można to stosować w dowolnym kodzie dwójkowym.
PRZYKŁAD:
DEC |
8 4 2 1 NKB |
Bit parzystości - p |
0 |
0000 |
0 |
1 |
0001 |
1 |
2 |
0010 |
1 |
3 |
0011 |
0 |
4 |
0100 |
1 |
5 |
0101 |
0 |
6 |
0110 |
0 |
7 |
0111 |
1 |
8 |
1000 |
1 |
9 |
1001 |
0 |
[1]
4.4.2. Kod ze stałą liczbą jedynek.
Do klasy kodów detekcyjnych należą kody ze stałą liczbą jedynek we wszystkich słowach kodowych. Ogólnie nazywamy je kodami „1 z n” i mogą one być wagowe lub niewagowe.
PRZYKŁAD:
Kod „1 z10”
DEC |
„1 z 10” |
0 |
0000000001 |
1 |
0000000010 |
2 |
0000000100 |
3 |
0000001000 |
4 |
0000010000 |
5 |
0000100000 |
6 |
0001000000 |
7 |
0010000000 |
8 |
0100000000 |
9 |
1000000000 |
[1]
4.5. Kody korekcyjne.
Oprócz kodów detekcyjnych, w systemach cyfrowych, np. w systemach transmisji danych, stosowane są kody korygujące błędy. Istnieje wiele takich kodów. Tu przedstawiony zostanie tylko jeden z nich, który ma zastosowanie w magnetycznych systemach zapisu informacji - kod CRC. [1]
4.5.1. Budowa kodu CRC.
Rozpatrzmy klasyczne dzielenie dwóch liczb całkowitych. Bez względu na system liczbowy (dziesiętny, binarny) obowiązuje tu zasada:
DZIELNA : DZIELNIK = ILORAZ + RESZTA
PRZYKŁAD:
32410 : 1910 = 1710 r. 1 = 1010001002 : 100112 = 100012 r. 1
101000100 : 10011 = 10001
10011
000010
00000
00101
00000
01010
00000
10100
10011
00001 - reszta
Zastępując klasyczne odejmowanie działaniem suma modulo 2 otrzymamy:
101000100 : 10011 = 10111 0 + 0 = 0
10011 0 + 1 = 1
001110 1 + 0 = 1
00000 1 + 1 = 0
011101
10011
011100
10011
011110
10011
01101 - reszta
Kody CRC korzystają właśnie z takiego działania. Pod pojęciem sumy kontrolnej danego ciągu danych w kodzie CRC rozumiemy resztę z dzielenia tego ciągu przez określony dzielnik.
Dowolnie długi ciąg danych zabezpieczony przy użyciu kodu CRC traktuje się jako dzielną. Ustalony dzielnik jest generatorem kodu. Reszta z dzielenia jest kodem CRC - sumą kontrolną w kodzie CRC.
PRZYKŁAD:
Na nośniku magnetycznym stosuje się 17-bitowy generator kodu o postaci 10001000000100001, który generuje 16-bitową resztę - kod CRC. Blok danych o wielkości 512 bajtów (sektor na dysku) zabezpieczony jest przez dopisanie w polu 2 bajtów kodu CRC.
[1]
4.6. Kody alfanumeryczne.
Najbardziej popularny obecnie jest kod ASCII. (ang. American Standard Code for Information Interchange) lub inaczej kod ISO (International Standard Organization). Kod ten stosowany jest dla znaków alfanumerycznych, tj. dla cyfr, liter, znaków pisarskich i znaków redakcyjnych sterujących. Zbiór znaków kodu ASCII składa się ze standardowych znaków (128) i rozszerzonych znaków (128). Razem 256 znaków. [1]
Nazwy znaków graficznych ASCII |
||
Wartość kodowa |
znak |
Nazwa |
32 |
|
space, spacja |
33 |
! |
exclamation mark, wykrzyknik |
34 |
" |
double quote, cudzysłów |
35 |
# |
hash, znak numeru |
36 |
$ |
dollar, znak dolara |
37 |
% |
percent, procent |
38 |
& |
|
39 |
' |
quote, apostrof |
40 |
( |
open parenthesis, lewy nawias okrągły |
41 |
) |
close parenthesis, prawy nawias okrągły |
42 |
* |
asterix, gwiazdka |
43 |
+ |
plus, plus |
44 |
, |
comma, przecinek |
45 |
- |
minus, łącznik, minus, dywiz |
46 |
. |
full stop, kropka |
47 |
/ |
oblique stroke, slash, kreska ułamkowa (ukośnik) |
48 - 58 |
|
Cyfry |
58 |
: |
colon, dwukropek |
59 |
; |
semicolon, średnik |
60 |
< |
less than, mniejsze od (lewy nawias kątowy) |
61 |
= |
equals, znak równości |
62 |
> |
greater than, większe od (prawy nawias kątowy) |
63 |
? |
question mark, znak zapytania |
64 |
@ |
|
65 - 90 |
|
wielkie litery łacińskie |
91 |
[ |
open square bracket, lewy nawias kwadratowy |
92 |
/ |
backslash, kreska ułamkowa odwrócona |
93 |
] |
close square bracket, prawy nawias kwadratowy |
94 |
^ |
caret, znak akcentu cyrkumfleksowego |
95 |
_ |
underscore, podkreślenie (wykorzystywany jako "twarda spacja") |
96 |
` |
backquote, znak akcentu słabego. |
97-122 |
|
małe litery łacińskie (mają kody o 32 większe od kodów wielkich liter) |
123 |
{ |
open curly bracket, lewy nawias klamrowy |
124 |
| |
vertical bar, kreska pionowa |
125 |
} |
close curly bracket, prawy nawias klamrowy |
126 |
~ |
tilde, tylda |
[5]
5.Sposoby przedstawiania liczb dwójkowych - dane numeryczne.
5.1. Liczby stałoprzecinkowe.
Liczba stałoprzecinkowa jest to liczba zapisana w postaci:
n - bitowa część całkowita m - bitowa część ułamkowa
umowne (stałe) położenie przecinka
Wartość takiej liczby wynika z definicji liczby w dwójkowym systemie liczbowym. Regułą zapisu jest stała pozycja przecinka
[5]
5.2. Liczby stałoprzecinkowe ze znakiem.
Do tej pory rozważane były tylko liczby dwójkowe dodatnie. Teraz zajmiemy się problemem znaku liczb dwójkowych stałoprzecinkowych. Liczby binarne muszą reprezentować zarówno liczby dodatnie jak i ujemne, liczby całkowite jak i ułamki oraz liczby mające część całkowitą i ułamkową. Istnieje kilka sposobów przedstawiania (zapisu) liczb dwójkowych ze znakiem.
[5]
5.2.1. Zapis w postaci moduł - znak.
W zapisie tym na najbardziej znaczącej pozycji umieszczony jest bit znaku S. Gdy S = 0, to liczba jest dodatnia; gdy S = 1, to ujemna. Liczba mieszana (n + m. Bitów bez bitu znaku) w zapisie moduł-znak ma postać:
Wartość dziesiętna takiej liczby wynosi:
PRZYKŁAD:
+127 = 011111111 S = 0 (liczba dodatnia)
-127 = 111111111 S = 1 (liczba ujemna)
[5]
5.2.2. Zapis w postaci uzupełnień do 1 (U1).
W zapisie tym najbardziej znaczący bit jest także bitem znaku (0 - liczba dodatnia i 1 - liczba ujemna), ale w zależności od jego wartości dalsze bity zapisu mają różne znaczenie. Jeśli bit znaku jest 0(liczba dodatnia), to dalsze bity są reprezentacją liczby dodatniej w kodzie NKB. Natomiast gdy bit znaku jest 1(liczba ujemna), to dalsze bity reprezentują moduł liczby ujemnej, w taki sposób, że zanegowane ich wartości odpowiadają modułowi tej liczby w kodzie NKB. Zakres liczb tego zapisu jest taki sam jak dla zapisu znak-moduł, a liczba zero ma także dwie reprezentacje.
PRZYKŁAD:
+127 = 011111111 S = 0 (liczba dodatnia)
-127 = 100000000 S = 1 (liczba ujemna)
[5]
5.2.3. Zapis w postaci uzupełnień do 2 (U2).
Najczęściej spotykanym w komputerach sposobem zapisu liczb jest tzw. zapis uzupełnień do 2 (w skrócie U2).
Liczby całkowite w zapisie U2 (n bitów bez znaku) mają postać:
Wartość dziesiętna (całkowita) takiej liczby wynosi:
Liczby ułamkowe w zapisie U2 (m bitów bez znaku) mają postać:
Wartość dziesiętna (ułamkowa) takiej liczby wynosi:
Powyższe rozważania nie są słuszne dla liczb mieszanych !!!
Można wykazać, że uzupełnienie do 2 danej liczby reprezentuje liczbę do niej przeciwną co do znaku, tzn. (x)u = -x
Praktyczna reguła wyznaczania uzupełnienia do 2 polega na zamianie wszystkich bitów tej liczby na przeciwne (negacja bitów) i dodanie 1.
PRZYKŁAD:
+118 = 01110110 U2: 01110110
10001001
+ 00000001
10001010 = -118
+0,125 = 0,001 U2: 0,001
1,110
+ 0,001
1,111 = -0,125
[5]
5.2.4. Zapis w postaci przesuniętej.
Niech ilość bitów liczby A wyrażonej w kodzie przesuniętym wynosi n.
Wartość dziesiętna liczby A wynosi:
PRZYKŁAD:
n = 4; p = 23 = 8
A =15 = 1111 w = A - p = 15 - 8 = 7
A = 0 = 0000 w = A - p = 0 - 8 = -8
A = 8 = 1000 w = A - p = 8 - 8 = 0
UWAGA! Są systemy, których przesunięcie p wynosi: p = 2n-1- 1
[5]
5.3. Ogólny format zapisu liczb stałoprzecinkowych.
Dane numeryczne (liczby) są przechowywane w komórkach pamięci lub rejestrach o ograniczonej długości. Istnieje zatem potrzeba określenia sposobu przechowywania liczb w pamięci (chodzi o ilość komórek pamięci i ich przeznaczenie - w którym miejscu przechowywane są poszczególne części liczby, tj. całkowita i ułamkowa oraz znak).
[5]
5.4. Format liczby mieszanej.
|
b |
b |
... |
b |
b |
... |
b |
5.5. Format liczby całkowitej.
|
b |
b |
.........................b |
|
5.6. Format liczby ułamkowej.
|
b |
b |
.........................b |
|
1
26
,
gdzie: bi należy do zbioru {0, 1}, cyfry 0, 1 nazywamy bitami
+
+
PRZYKŁAD:
1001,11012 = 1 . 23 + 0 . 22 + 0 . 21 + 1 . 20 + 1 . 2-1 + 1 . 2-2 + 1 . 2-3 +
+ 1 . 2-4 = 9,8125 10
Konwersji dziesiętno-dwójkowej można dokonać na drodze
wielokrotnego dzielenia przez 2 całkowitej części oraz mnożenia
przez 2 ułamkowej części liczby dziesiętnej:
9,8125 10 = 1001,11012
9 : 2 = 4 r 1 - LSB 0,8125 . 2 = 1,6250 = 0,6250 nad. 1 - MSB
4 : 2 = 2 r 0 0,6250 . 2 = 1,2500 = 0,2500 nad. 1
2 : 2 = 1 r 0 0,2500 . 2 = 0,5000 = 0,5000 nad. 0
1 : 2 = 0 r 1 - MSB 0,5000 . 2 = 1,0000 = 0,0000 nad. 1 - LSB
2.3. Szesnastkowy system liczbowy.
W systemie szesnastkowym p = 16. Szesnastkowa liczba mieszana,
składająca się z n-cyfrowej części całkowitej i m-cyfrowej części
ułamkowej ma postać:
,
gdzie: bi należy do zbioru {0, 1}, cyfry 0, 1 nazywamy bitami
+
+
PRZYKŁAD
F3A,C816 = 15 . 162 + 3 . 161 + 10 . 160 + 12 . 16-1 + 8 . 16-2 =
= 4898,78125 10
Liczba przedstawiona w systemie dwójkowym może być bezpośrednio
przetworzona na liczbę szesnastkową (hexa) i odwrotnie.
W tym celu należy liczbę dwójkową podzielić na grupy czterobitowe
poczynając od przecinka w lewo i w prawo oraz zapisać otrzymane
tetrady ekwiwalentami szesnastkowymi (analogicznie zamieniamy liczby
szesnastkowe na dwójkowe).
PRZYKŁAD
11010101000,11110101112 = 0110 1010 1000 , 111 0101 1100 =
= 6A8,F5C
Do zamiany liczb dwójkowych na szesnastkowe i odwrotnie przydatna jest następująca tablica.
Moduł-
-znak
,
Przecinek niewidoczny - domyślny
Moduł - znak, U2
,
Przecinek niewidoczny - domyślny
Moduł - znak, U2
,
Przecinek niewidoczny - domyślny