TI/Zera i jedynki: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 45 wersji utworzonych przez 2 użytkowników)
Linia 1: Linia 1:
 
+
==[[%22Technologia_informacyjna%22|TI/]] Zera i jedynki==
==Zera i jedynki==
+
W informatyce zdecydowanie króluje zapis dwójkowy (binarny). Można powiedzieć, że współczesne komputery "rozumują" w najprostszych z możliwych kategorii:
 
 
Dlaczego akurat zera i jedynki? Otóż komputery "rozumują" w najprostszych z możliwych kategorii:
 
 
* namagnesowane/rozmagnesowane (fragment powierzchni dysku lub dyskietki),
 
* namagnesowane/rozmagnesowane (fragment powierzchni dysku lub dyskietki),
 
* prąd płynie/nie płynie (we wnętrznościach komputera podczas pracy),
 
* prąd płynie/nie płynie (we wnętrznościach komputera podczas pracy),
 
* światło odbija się lub nie (od powierzchni płyty CD-ROM).
 
* światło odbija się lub nie (od powierzchni płyty CD-ROM).
  
Czyli ogólnie jest/nie ma, albo 1/0. Z jedynek i zer możemy złożyć
+
Czyli ogólnie jest/nie ma, albo 1/0. Z pomocą jedynek i zer możemy zapisać dowolną liczbę naturalną, na przykład dodając jedynki i pomijając zera.  
dowolną liczbę, choćby dodając jedynki i pomijając zera. Można to
+
Najefektywniejszym sposobem zapisu liczb naturalnych za pomocą zer i jedynek jest kod dwójkowy (inaczej binarny), czyli pozycyjny [https://pl.wikipedia.org/wiki/System_liczbowy system liczbowy], w którym podstawą pozycji są kolejne potęgi liczby 2. Jak w każdym pozycyjnym systemie liczbowym, liczby zapisuje się tu jako ciąg cyfr, z których każda jest mnożnikiem kolejnej potęgi liczby stanowiącej podstawę systemu.  Np. liczba zapisana w dziesiętnym systemie liczbowym jako 27, w systemie dwójkowym przybiera postać 11011, gdyż:
zrobić znacznie efektywniej — kod dwójkowy za pomocą ośmiu
+
 
zer-lub-jedynek (bitów) pozwala zapisać liczbę całkowitą od 0 do
+
 
255. Działa to podobnie jak kod dziesiątkowy, w którym zapisujemy
+
<div align="center">
liczby na co dzień.
+
<math>(11011)_2 = 1*2^4 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 16 + 8 + 0 + 2 + 1 = 27</math>
 +
</div>
 +
 
 +
 
 +
'''Zapamiętajmy:''' ''liczba 27 '''nie''' jest zapisywana jako znaki "dwa" i "siedem", tylko w postaci '''bitów''', które wizualizujemy jako 11011, ale fizycznie zera i jedynki mogą odpowiadać np. różnym poziomom napięcia, namagnesowania czy odbijania światła.
 +
 
 +
 
 +
===Binarne reprezentacje liczb===
 +
Z przyczyn technicznych komputery operują na ciągach bitów o ściśle określonej długości, tzw. słowach maszynowych. Pierwsze popularne komputery były  8-bitowe, czyli długość słowa maszynowego w ich architekturze wynosiła 8 bitów, inaczej jeden bajt. Współczesne komputery używają słów 64-bitowych, czyli w naturalny sposób możemy w nich przechowywać i przesyłać np. liczby całkowite od zera do 2<sup>64</sup>-1 = 18446744073709551615. Jeśli chcemy korzystać z liczb ujemnych, jeden bit musimy zarezerwować na znak, i dostajemy zakres od -2<sup>63</sup>-1 do 2<sup>63</sup>-1.
 +
 
 +
Zarezerwowanie na liczbę określonej liczby bitów może prowadzić do kłopotów, gdy np. w wyniku mnożenia dostaniemy liczbę spoza zarezerwowanego zakresu. Wtedy w programie może pojawić się błąd — na przykład możemy niechcący zmienić wartości następnych komórek pamięci w nieoczekiwany sposób. Na szczęście Python liczby całkowite zapisuje domyślnie w taki sposób, że ograniczeniem na ich wielkość jest tylko pojemność pamięci:
 +
 
 +
>>> pow(2,200)
 +
1606938044258990275541962092341162602522202993782792835301376
  
Dwójkowy system liczbowy (inaczej binarny) to pozycyjny system
+
Inaczej wygląda w języku Python zapis liczb rzeczywistych — reprezentowane są one jako [https://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa liczby zmiennoprzecinkowe], których zakres i dokładność są stałe dla danej platformy i kompilatora. W Pythonie zakres liczb zmiennoprzecinkowych można sprawdzić następującą komendą:
liczbowy, w którym podstawą pozycji są kolejne potęgi liczby 2. Do
 
zapisu liczb potrzebne są więc tylko dwa znaki: 0 i 1. Powszechnie
 
używany w informatyce. Jak w każdym pozycyjnym systemie liczbowym,
 
liczby zapisuje się tu jako ciąg cyfr, z których każda jest mnożnikiem
 
kolejnej potęgi liczby stanowiącej podstawę systemu. Np. liczba
 
zapisana w dziesiętnym systemie liczbowym jako 10, w systemie
 
dwójkowym przybiera postać 1010, gdyż:
 
  
<math>(1010)_2 = 1x2^3 + 0x2^2 + 1x2^1 + 0x2^0 = 8+2 = 10</math>
+
>>> import sys; sys.float_info.max
 +
1.7976931348623157e+308
 +
>>> sys.float_info.min
 +
2.2250738585072014e-308
  
Jednak nawet do pisania programów, nie mówiąc już o listach, używamy liter. Skoro mamy już liczby, to pozostaje...
+
W większości języków programowania deklarujemy zwykle na początku kodu, czy daną zmienną traktować jako liczbę całkowitą czy zmiennoprzecinkową (<code>integer</code> czy <code>float</code>). Python domyślnie "odgaduje" rodzaj zmiennej czy stałej na podstawie notacji; liczbie <code>2.71</code> przypisze typ <code>float</code>, a liczbie <code>3</code> — <code>integer</code>. Jeśli chcemy, żeby liczbę całkowitą interpreter potaktował jako zmiennoprzecinkową (z zerami po przecinku), wystarczy zamiast <code>3</code> napisać <code>3.0</code>. Różnice podsumowuje poniższy przykład:
  
==Ponumerować litery (ASCII)==
+
>>> pow(11, 500)
 +
4969841967312266896286943165524556231604764697309876808312576299409619224420391617098708396225374948938868811371457556190750351283
 +
7449875405039140440330009424543851341473661479835156198793475230001956315493079590327474913873798690064481533085354154735423096767
 +
0270037410967840218444329890659363847179221191623190320315868031908010944057323402271016538750345991105598826076185532402126954259
 +
73141414122679894203387024067292317607709706656265698204172143249895717068799024075072923130694160791083167647986127226561792230001
 +
>>> pow(11.0, 500)
 +
Traceback (most recent call last):
 +
  File "<stdin>", line 1, in <module>
 +
OverflowError: (34, 'Result too large')
  
...i jeszcze upewnić się, że różne komputery używają tej samej
+
==ASCII i Unicode==
numeracji. Niewątpliwym standardem jest ASCII &mdash; American
+
Żeby zapisywać cyfrowo teksty, trzeba po prostu ponumerować litery.
Standard Code for Information Interchange. Poza literami i cyframi
+
Do niedawna standardem był ASCII (American Standard Code for Information Interchange), aktualnie rozszerzony do Unicode.  
jest w nim jeszcze kilka przydatnych znaczków:
+
 
[[Grafika:ASCII.png|thumb|376px|<figure id="fig:ASCII">Tabela
+
[[Grafika:ASCII.png|thumb|376px|<figure id="fig:ASCII">Tabela ASCII symbole i odpowiadające im w ASCII numery (po
ASCII</figure> &mdash; symbole i odpowiadające im w ASCII numery (po
+
prawej w każdej kolumnie)</figure>]]
prawerj w każdej kolumnie)]]
 
  
 
Jedna litera to w ASCII jeden bajt. Bajt to osiem bitów, czyli liczba
 
Jedna litera to w ASCII jeden bajt. Bajt to osiem bitów, czyli liczba
Linia 43: Linia 57:
 
druga połowa. Niestety, znaki wszystkich alfabetów narodowych nie
 
druga połowa. Niestety, znaki wszystkich alfabetów narodowych nie
 
zmieszczą się tam (tj. między 128 a 255) "za jednym razem". Dlatego
 
zmieszczą się tam (tj. między 128 a 255) "za jednym razem". Dlatego
dla różnych języków istnieją różne kodowania, czyli numeracje liter
+
dla różnych języków wprowadzano różne kodowania, czyli numeracje liter
 
spoza ASCII. Dla języka polskiego obowiązującym w Internecie
 
spoza ASCII. Dla języka polskiego obowiązującym w Internecie
standardem jest ISO3.4 8859-2. Zawiera on litery wystarczające do
+
standardem jest (a w zasadzie można już powiedzieć, że był) ISO 8859-2. Zawiera on litery wystarczające do
 
pisania (poza angielskim) w językach: Albanii, Bośni, Chorwacji,
 
pisania (poza angielskim) w językach: Albanii, Bośni, Chorwacji,
 
Czech, Finlandii, Węgier, Polski, Rumunii, Serbii, Słowacji i
 
Czech, Finlandii, Węgier, Polski, Rumunii, Serbii, Słowacji i
Słowenii. Wystarczają do tego (poza znakami z tablicy ) następujące
+
Słowenii.  
 +
<!--Wystarczają do tego (poza znakami z tablicy ASCII) następujące
 
znaki:
 
znaki:
  
 
[[Grafika:Iso_chars.png]]
 
[[Grafika:Iso_chars.png]]
 +
  
 
Jako ciekawostkę zanotować warto, że w pionierskim okresie
 
Jako ciekawostkę zanotować warto, że w pionierskim okresie
Linia 58: Linia 74:
 
rekordem. Aktualnie poza ISO 8859-2 spotkać można jeszcze kodowanie
 
rekordem. Aktualnie poza ISO 8859-2 spotkać można jeszcze kodowanie
 
używane w produktach firmy Microsoft &mdash; Windows-1250.
 
używane w produktach firmy Microsoft &mdash; Windows-1250.
 
+
-->
Dlatego też, aby prawidłowo wyświetlać tekst napisany w języku innym
+
W tej sytuacji, aby prawidłowo wyświetlać tekst napisany w języku innym
niż angielski, musimy:
+
niż angielski, musieliśmy:
  
 
* wiedzieć, w jakim standardzie zakodowane są litery spoza ASCII,
 
* wiedzieć, w jakim standardzie zakodowane są litery spoza ASCII,
 
* mieć czcionkę (font) z literami danego języka, umieszczonymi w odpowiednich miejscach.
 
* mieć czcionkę (font) z literami danego języka, umieszczonymi w odpowiednich miejscach.
  
Właśnie wtedy, gdy nie jest spełniony któryś z tych warunków &mdash;
+
Gdy nie był spełniony któryś z tych warunków, w miejsce polskich znaków diakrytycznych
czasem po przeniesieniu tekstu do innego komputera &mdash; w miejsce
+
ąćęł... pojawiały się czasami dziwne "krzaczki"albo znaki z zupełnie innych alfabetów.
ąćęł... pojawiają się czasami dziwne "krzaczki" albo znaki z
+
Rozwiązaniem tego problemu jest standard [http://unicode.org UNICODE], który powstał pod koniec ubiegłego wieku.  
zupełnie innych alfabetów. Pomysł na globalne i ostateczne
+
Zamiast jednego bajtu (ośmiu bitów), które w ASCII pozwalałay na zapis do 255 znaków, na tablicę wszystkich znaków znanych ludzkości przeznaczono cztery bajty (32 bity), co daje możliwość zapisu 4 294 967 296 znaków. Aby zmiejszyć objętość takiego zapisu stosuje się również bardziej skomplikowane sposoby zapisu, z różną liczbą bajtów w zależności od znaku. Np. w najpopularniejszym kodowaniu  [https://pl.wikipedia.org/wiki/UTF-8 UTF-8] najpopularniejsze znaki (z ASCII) zajmują jeden bajt (czyli 8 bitów), a inne od 2 do 4
rozwiązanie tego problemu jest prosty: jeśli 255 to za mało,
 
zarezerwujmy tyle miejsca, aby starczyło na litery wszystkich
 
alfabetów naraz i ustalmy jeden globalny standard!
 
 
 
Ten standard już isnieje &mdash; nazywa się [http://unicode.org UNICODE]. Jego podstawą jest baza ponad 100&nbsp;000 znaków z
 
kilkudziesięciu różnych skryptów (w uproszczeniu alfabetów). Trzeba
 
było wielu lat pracy przedstawicieli wielu krajów świata by
 
skatalogować znaki (litery) używane w alfabetach greckim, rzymskim,
 
hebrajskim, cyrylicy, devangari,... Prawdziwym wyzwaniem są oczywiście
 
chińskie ideogramy &mdash; obecnie w bazie Unicode opisano ich ponad
 
80&nbsp;000.
 
 
 
Każdy znak z bazy Unicode ma swój numer i zapis tekstu w Unicode'zie
 
oznacza po prostu zapisanie tych liczb. Istnieje parę sposobów takiego
 
zapisu - najprostszy z nich to poprostu zapis znaków jako 32 bajtowych
 
liczb (UTF-32). Jego wadą jest marnotrastwo miejsca. Aby zmiejszyć
 
objętość takiego zapisu stosuje się również bardziej skompilowane
 
sposoby zapisu w których stosuje się różną liczbę bitów w zależności
 
od znaku. Np. w zapisie zwanym UTF-8, najbardziej popularne znaki (o
 
małych numerach) zajmują jeden bajt (czyli 8 bitów), a inne od 2 do 4
 
 
bajtów (czyli od 16 do 32 bitów).
 
bajtów (czyli od 16 do 32 bitów).
  
Niestety, zanim ten standard uratuje cyfrową wieżę Babel, komputery (a
+
==Pliki tekstowe i binarne==
tak naprawdę systemy operacyjne i programy) muszą "zmienić swój sposób
+
Plik to ciąg zer i jedynek (bitów), za pomocą którego
myślenia" o literach &mdash; wszak dotychczas jedna litera to był
+
zapisano dowolną informację na dysku, dyskietce, płycie CD-ROM
jeden bajt, a nie dwa lub więcej! No i dopiero powstają czcionki ze
 
znakami wszystkich skryptów naraz: cyrylicy, hebrajskiego,
 
chińskiego...
 
 
 
==Rodzaje plików: pliki z danymi (tekstowe i binarne) i programy==
 
 
 
Co to jest plik (file)? Ciąg zer i jedynek (bitów), za pomocą którego
 
zapisano dowolną informację &mdash; na dysku, dyskietce, płycie CD-ROM
 
 
czy taśmie. Warto sobie uświadomić ten fakt dokładnie: każdy plik jest
 
czy taśmie. Warto sobie uświadomić ten fakt dokładnie: każdy plik jest
nieprzerwanym ciągiem zer i jedynek i niczym więcej &mdash; bez
+
nieprzerwanym ciągiem zer i jedynek i niczym więcej bez
 
odstępów, "opisów", ani żadnej dodatkowej informacji, która mówiłaby
 
odstępów, "opisów", ani żadnej dodatkowej informacji, która mówiłaby
nam, jak dany plik odczytywać. Dlatego też, w celu poprawnego
+
nam, jak dany plik odczytywać, interpretować i wyświetlać. Dlatego też, w celu poprawnego
 
odczytania, musimy przynajmniej wiedzieć, z jakiego rodzaju plikiem
 
odczytania, musimy przynajmniej wiedzieć, z jakiego rodzaju plikiem
 
mamy do czynienia.
 
mamy do czynienia.
  
 
Rozróżniamy przede wszystkim dwa rodzaje plików: tekstowe i
 
Rozróżniamy przede wszystkim dwa rodzaje plików: tekstowe i
binarne. Nazwy są trochę mylące, bo wszystkie pliki są binarne, czyli
+
binarne. Nazwy są trochę mylące, bo w pewnym sensie wszystkie pliki są binarne, czyli
zero-jedynkowe. Jednak pliki tekstowe zajmują wśród nich wyróżnioną
+
zapisane jako ciąg zer i jedynek. Jednak pliki tekstowe zajmują wśród nich wyróżnioną
pozycję, sposób ich odczytywania jest bowiem najbardziej w świecie
+
pozycję, gdzuyż sposób ich odczytywania jest najbardziej w świecie
 
komputerów rozpowszechnionym standardem. Znajdują się w nich litery,
 
komputerów rozpowszechnionym standardem. Znajdują się w nich litery,
zamienione na bity według przepisu z rozdziałów [[TI/Technologia_Informacyjna/Wszystko_jest_plikiem#Zera i jedynki|Zera i jedynki]] i [[TI/Technologia_Informacyjna/Wszystko_jest_plikiem#Ponumerować litery|Ponumerować litery]]. Zapisany w
+
zamienione na bity według przepisu z poprzedniego rozdziału. Zapisany w
 
ten sposób plik można odczytać na dowolnym komputerze, niezależnie od
 
ten sposób plik można odczytać na dowolnym komputerze, niezależnie od
 
systemu operacyjnego itp. W dodatku ''odczytać'' możemy tu rozumieć
 
systemu operacyjnego itp. W dodatku ''odczytać'' możemy tu rozumieć
Linia 123: Linia 111:
 
programu.
 
programu.
  
Ale nie wszystko najwygodniej opisywać literami &mdash; na przykład
+
Ale nie wszystko najwygodniej opisywać literami na przykład
obrazy. W tym przypadku bity interpretujemy zupełnie inaczej &mdash;
+
obrazy. W tym przypadku bity interpretujemy zupełnie inaczej
 
jako liczby opisujące kolory kolejnych maleńkich fragmentów obrazu
 
jako liczby opisujące kolory kolejnych maleńkich fragmentów obrazu
 
(pikseli). Ale po samych bitach nie rozróżnimy, czy opisują tekst, czy
 
(pikseli). Ale po samych bitach nie rozróżnimy, czy opisują tekst, czy
Linia 136: Linia 124:
 
Ogólnie, pliki binarne to wszystkie pliki nietekstowe. Mogą zawierać
 
Ogólnie, pliki binarne to wszystkie pliki nietekstowe. Mogą zawierać
 
obrazy, dźwięki, filmy lub dowolne dane. Jeśli zapisano je w jednym z
 
obrazy, dźwięki, filmy lub dowolne dane. Jeśli zapisano je w jednym z
ogólnie przyjętych standardów (jak na przykład te z tabl. <xr
+
ogólnie przyjętych standardów, to zwykle daje się je odczytać (czyli
id="tab:4.1"> %i</xr>), to zwykle daje się je odczytać (czyli
 
 
sensownie wyświetlić lub odegrać) na większości komputerów, jeśli
 
sensownie wyświetlić lub odegrać) na większości komputerów, jeśli
 
tylko zainstalowano na nich odpowiednie programy.
 
tylko zainstalowano na nich odpowiednie programy.
  
Plik może też zawierać program komputerowy &mdash; wtedy zrozumiały
+
Plik binarny może też zawierać program komputerowy wtedy zrozumiały
 
jest tylko dla tego systemu operacyjnego, dla którego przeznaczony
 
jest tylko dla tego systemu operacyjnego, dla którego przeznaczony
 
jest program. Na przykład program napisany dla MS Windows (którego
 
jest program. Na przykład program napisany dla MS Windows (którego
Linia 150: Linia 137:
 
oczywiście tekstowych, powinny dać się wyświetlić na większości
 
oczywiście tekstowych, powinny dać się wyświetlić na większości
 
komputerów (jeśli zainstalowano odpowiednie programy).
 
komputerów (jeśli zainstalowano odpowiednie programy).
 
Program może czasem po prostu odtwarzać film czy animację. Dla użytkowników tego samego systemu będzie on łatwiejszy do odtworzenia od zapisu filmu w którymś ze standardowych formatów (np. star.avi, *.mpg), gdyż nie wymaga, żeby na komputerze był zainstalowany program obsługujący dany format. Ale, szczególnie w MS Windows, odtwarzanie takich programów, "znalezionych" w Internecie czy otrzymanych od znajomych pocztą elektroniczną, niesie ze sobą niebezpieczeństwo uszkodzenia systemu przez wirus, którym program może być zainfekowany (problem ten opisano bliżej w rozdziale 4.4). Warto zapamiętać, że przesyłając pocztą niewinnie zabawne "programiki", możemy narazić adresata na utratę danych (chyba, że pracuje w innym systemie operacyjnym i po prostu nie będzie mógł programu uruchomić).
 
  
 
Plik może też zawierać dane zapisane przez jakiś program w formacie
 
Plik może też zawierać dane zapisane przez jakiś program w formacie
Linia 159: Linia 144:
 
dane). Dotyczy to również tekstów. Gdybyśmy pozostali przy treści,
 
dane). Dotyczy to również tekstów. Gdybyśmy pozostali przy treści,
 
czyli samym tekście, wystarczyłby standard ASCII. Jednak coraz
 
czyli samym tekście, wystarczyłby standard ASCII. Jednak coraz
częściej nad treścią dominuje forma &mdash; w najprostszym liście
+
częściej nad treścią dominuje forma w najprostszym liście
trafia się nawet kilka różnych czcionek. Informacja o rozmiarach i
+
trafia się często kilka różnych czcionek. Informacja o rozmiarach i
 
rodzajach czcionek, jak również rozmieszczeniu tekstu na stronie, nie
 
rodzajach czcionek, jak również rozmieszczeniu tekstu na stronie, nie
doczekała się standardowego formatu zapisu &mdash; producent każdego
+
doczekała się standardowego formatu zapisu producent każdego
 
programu uważa swój format za jedynie słuszny. Jedynym dość
 
programu uważa swój format za jedynie słuszny. Jedynym dość
 
rozpowszechnionym standardem jest oparty na ASCII rich text format
 
rozpowszechnionym standardem jest oparty na ASCII rich text format
Linia 170: Linia 155:
  
  
'''Ten sam ciąg bitów można interpretować na różne sposoby'''; na przykład <code>01000011010011110011111100111111</code> można odczytać jako:
+
'''Ten sam ciąg bitów (plik) można interpretować na różne sposoby'''; na przykład <code>01000011010011110011111100111111</code> można odczytać jako:
{| class="wikitable" border="1"
+
{| class="wikitable" style="margin-left: auto; margin-right: auto; border: none;"
 
|-
 
|-
 
!  odczyt
 
!  odczyt
Linia 211: Linia 196:
 
formatu. Stąd często kliknięcie pliku, którego rozszerzenie jest przez
 
formatu. Stąd często kliknięcie pliku, którego rozszerzenie jest przez
 
system skojarzone z obsługującym ten typ programem, wystarcza do
 
system skojarzone z obsługującym ten typ programem, wystarcza do
uruchomienia odpowiedniego programu i otwarcia pliku.
+
uruchomienia odpowiedniego programu i otwarcia pliku. Poniżej przytaczamy niektóre standardowe rozszerzenia nazw plików:
 +
pliki tekstowe                  *.txt, *.asc
 +
obrazy                         *.jpg, *.jpeg, *.gif, *.bmp, *.pcx, *.png
 +
wideo                         *.mpg, *.mpeg, *.avi
 +
dźwięk                         *.mp3, *.wav, *.au, *.mid
 +
pliki TeX i LaTeX         *.tex
 +
źródła programów         *.c, *.pas, *.java...
 +
pliki WWW                 *.html, *.htm
 +
programy MS Windows         *.exe
 +
Portable Document Format        *.pdf
 +
archiwa skompresowanych plików  *.zip, *.rar, *.arj, *.gz, *.tgz, *.Z, *.tar.Z
 +
pliki edytora tekstów MS Word    *.doc, *.docx
 +
MS Excel (arkusz kalkulacyjny) *.xls, *.xlsx
  
<figure id="tab:4.1">Niektóre standardowe rozszerzenia nazw plików</figure>
 
pliki tekstowe ASCII *.txt, *.asc
 
obrazy *.jpg, *.jpeg, *.gif, *.bmp, *.pcx, *.png
 
video *.mpg, *.mpeg, *.avi
 
dźwięk *.mp3, *.wav, *.au, *.mid
 
pliki dla programów TEX i LATEX *.tex
 
teksty programów (C, Pascal, Java...) *.c, *.pas, *.java...
 
pliki dla WWW *.html, *.htm
 
programy MS Windows *.exe
 
skrypty MS Windows *.bat, *.vbs, *.vsh
 
PostScript (książki, rysunki) *.ps, *.eps
 
Portable Document Format *.pdf
 
archiwa skompresowanych plików *.zip, *.rar, *.arj, *.gz, *.tgz, *.Z, *.tar.Z
 
  
Rozszerzenia plików tworzonych przez niektóre programy
 
MS Word (edytor tekstów) *.doc
 
MS Excel (arkusz kalkulacyjny) *.xls, *.xlw
 
MS Access (baza danych) *.mdb
 
DBase (baza danych) *.db
 
Corel Draw! (program graficzny) *.cdr
 
Corel PhotoPaint *.cpt
 
  
<noinclude>
+
<div align="right">
 +
[[TI/Cyfrowy_świat|⬅]]  [["Technologia_informacyjna"|⬆]]  [[TI/Algorytm|⮕]]
 +
</div>

Aktualna wersja na dzień 13:50, 9 paź 2024

TI/ Zera i jedynki

W informatyce zdecydowanie króluje zapis dwójkowy (binarny). Można powiedzieć, że współczesne komputery "rozumują" w najprostszych z możliwych kategorii:

  • namagnesowane/rozmagnesowane (fragment powierzchni dysku lub dyskietki),
  • prąd płynie/nie płynie (we wnętrznościach komputera podczas pracy),
  • światło odbija się lub nie (od powierzchni płyty CD-ROM).

Czyli ogólnie jest/nie ma, albo 1/0. Z pomocą jedynek i zer możemy zapisać dowolną liczbę naturalną, na przykład dodając jedynki i pomijając zera. Najefektywniejszym sposobem zapisu liczb naturalnych za pomocą zer i jedynek jest kod dwójkowy (inaczej binarny), czyli pozycyjny system liczbowy, w którym podstawą pozycji są kolejne potęgi liczby 2. Jak w każdym pozycyjnym systemie liczbowym, liczby zapisuje się tu jako ciąg cyfr, z których każda jest mnożnikiem kolejnej potęgi liczby stanowiącej podstawę systemu. Np. liczba zapisana w dziesiętnym systemie liczbowym jako 27, w systemie dwójkowym przybiera postać 11011, gdyż:


[math](11011)_2 = 1*2^4 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 16 + 8 + 0 + 2 + 1 = 27[/math]


Zapamiętajmy: liczba 27 nie jest zapisywana jako znaki "dwa" i "siedem", tylko w postaci bitów, które wizualizujemy jako 11011, ale fizycznie zera i jedynki mogą odpowiadać np. różnym poziomom napięcia, namagnesowania czy odbijania światła.


Binarne reprezentacje liczb

Z przyczyn technicznych komputery operują na ciągach bitów o ściśle określonej długości, tzw. słowach maszynowych. Pierwsze popularne komputery były 8-bitowe, czyli długość słowa maszynowego w ich architekturze wynosiła 8 bitów, inaczej jeden bajt. Współczesne komputery używają słów 64-bitowych, czyli w naturalny sposób możemy w nich przechowywać i przesyłać np. liczby całkowite od zera do 264-1 = 18446744073709551615. Jeśli chcemy korzystać z liczb ujemnych, jeden bit musimy zarezerwować na znak, i dostajemy zakres od -263-1 do 263-1.

Zarezerwowanie na liczbę określonej liczby bitów może prowadzić do kłopotów, gdy np. w wyniku mnożenia dostaniemy liczbę spoza zarezerwowanego zakresu. Wtedy w programie może pojawić się błąd — na przykład możemy niechcący zmienić wartości następnych komórek pamięci w nieoczekiwany sposób. Na szczęście Python liczby całkowite zapisuje domyślnie w taki sposób, że ograniczeniem na ich wielkość jest tylko pojemność pamięci:

>>> pow(2,200)
1606938044258990275541962092341162602522202993782792835301376

Inaczej wygląda w języku Python zapis liczb rzeczywistych — reprezentowane są one jako liczby zmiennoprzecinkowe, których zakres i dokładność są stałe dla danej platformy i kompilatora. W Pythonie zakres liczb zmiennoprzecinkowych można sprawdzić następującą komendą:

>>> import sys; sys.float_info.max
1.7976931348623157e+308
>>> sys.float_info.min
2.2250738585072014e-308

W większości języków programowania deklarujemy zwykle na początku kodu, czy daną zmienną traktować jako liczbę całkowitą czy zmiennoprzecinkową (integer czy float). Python domyślnie "odgaduje" rodzaj zmiennej czy stałej na podstawie notacji; liczbie 2.71 przypisze typ float, a liczbie 3integer. Jeśli chcemy, żeby liczbę całkowitą interpreter potaktował jako zmiennoprzecinkową (z zerami po przecinku), wystarczy zamiast 3 napisać 3.0. Różnice podsumowuje poniższy przykład:

>>> pow(11, 500)
4969841967312266896286943165524556231604764697309876808312576299409619224420391617098708396225374948938868811371457556190750351283
7449875405039140440330009424543851341473661479835156198793475230001956315493079590327474913873798690064481533085354154735423096767
0270037410967840218444329890659363847179221191623190320315868031908010944057323402271016538750345991105598826076185532402126954259
73141414122679894203387024067292317607709706656265698204172143249895717068799024075072923130694160791083167647986127226561792230001
>>> pow(11.0, 500)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')

ASCII i Unicode

Żeby zapisywać cyfrowo teksty, trzeba po prostu ponumerować litery. Do niedawna standardem był ASCII (American Standard Code for Information Interchange), aktualnie rozszerzony do Unicode.

Tabela ASCII — symbole i odpowiadające im w ASCII numery (po prawej w każdej kolumnie)

Jedna litera to w ASCII jeden bajt. Bajt to osiem bitów, czyli liczba między 0 a 255. Tablica ASCII (rys. 1) kończy się przed numerem 127. Za to brak tam ąćęłń... Nawet jeśli pominiemy pierwsze 32 znaki (są tam różne dziwne kody), pozostaje nam jeszcze druga połowa. Niestety, znaki wszystkich alfabetów narodowych nie zmieszczą się tam (tj. między 128 a 255) "za jednym razem". Dlatego dla różnych języków wprowadzano różne kodowania, czyli numeracje liter spoza ASCII. Dla języka polskiego obowiązującym w Internecie standardem jest (a w zasadzie można już powiedzieć, że był) ISO 8859-2. Zawiera on litery wystarczające do pisania (poza angielskim) w językach: Albanii, Bośni, Chorwacji, Czech, Finlandii, Węgier, Polski, Rumunii, Serbii, Słowacji i Słowenii. W tej sytuacji, aby prawidłowo wyświetlać tekst napisany w języku innym niż angielski, musieliśmy:

  • wiedzieć, w jakim standardzie zakodowane są litery spoza ASCII,
  • mieć czcionkę (font) z literami danego języka, umieszczonymi w odpowiednich miejscach.

Gdy nie był spełniony któryś z tych warunków, w miejsce polskich znaków diakrytycznych ąćęł... pojawiały się czasami dziwne "krzaczki", albo znaki z zupełnie innych alfabetów. Rozwiązaniem tego problemu jest standard UNICODE, który powstał pod koniec ubiegłego wieku. Zamiast jednego bajtu (ośmiu bitów), które w ASCII pozwalałay na zapis do 255 znaków, na tablicę wszystkich znaków znanych ludzkości przeznaczono cztery bajty (32 bity), co daje możliwość zapisu 4 294 967 296 znaków. Aby zmiejszyć objętość takiego zapisu stosuje się również bardziej skomplikowane sposoby zapisu, z różną liczbą bajtów w zależności od znaku. Np. w najpopularniejszym kodowaniu UTF-8 najpopularniejsze znaki (z ASCII) zajmują jeden bajt (czyli 8 bitów), a inne od 2 do 4 bajtów (czyli od 16 do 32 bitów).

Pliki tekstowe i binarne

Plik to ciąg zer i jedynek (bitów), za pomocą którego zapisano dowolną informację — na dysku, dyskietce, płycie CD-ROM czy taśmie. Warto sobie uświadomić ten fakt dokładnie: każdy plik jest nieprzerwanym ciągiem zer i jedynek i niczym więcej — bez odstępów, "opisów", ani żadnej dodatkowej informacji, która mówiłaby nam, jak dany plik odczytywać, interpretować i wyświetlać. Dlatego też, w celu poprawnego odczytania, musimy przynajmniej wiedzieć, z jakiego rodzaju plikiem mamy do czynienia.

Rozróżniamy przede wszystkim dwa rodzaje plików: tekstowe i binarne. Nazwy są trochę mylące, bo w pewnym sensie wszystkie pliki są binarne, czyli zapisane jako ciąg zer i jedynek. Jednak pliki tekstowe zajmują wśród nich wyróżnioną pozycję, gdzuyż sposób ich odczytywania jest najbardziej w świecie komputerów rozpowszechnionym standardem. Znajdują się w nich litery, zamienione na bity według przepisu z poprzedniego rozdziału. Zapisany w ten sposób plik można odczytać na dowolnym komputerze, niezależnie od systemu operacyjnego itp. W dodatku odczytać możemy tu rozumieć dosłownie, gdyż po zamianie bitów na litery (czyli wyświetleniu pliku ASCII) pojawia się tekst, zwykle zrozumiały dla człowieka. Może nie zawsze całkiem zrozumiały, ale przynajmniej powinniśmy zgadnąć, czy jest to sprawozdanie, list, tekst strony WWW czy kod źródłowy programu.

Ale nie wszystko najwygodniej opisywać literami — na przykład obrazy. W tym przypadku bity interpretujemy zupełnie inaczej — jako liczby opisujące kolory kolejnych maleńkich fragmentów obrazu (pikseli). Ale po samych bitach nie rozróżnimy, czy opisują tekst, czy obraz! Dlatego musimy (my lub korzystające z plików programy, czyli w tym przypadku edytory tekstów lub programy graficzne) wiedzieć, jakiego typu informacja znajduje się w pliku i jak ją interpretować. W przeciwnym razie, jeśli liczby opisujące obraz będziemy chcieli interpretować jako tekst (wczytując do edytora tekstów), dostaniemy bezsensowną sekwencję typu *5&^%\U)(&^%$.

Ogólnie, pliki binarne to wszystkie pliki nietekstowe. Mogą zawierać obrazy, dźwięki, filmy lub dowolne dane. Jeśli zapisano je w jednym z ogólnie przyjętych standardów, to zwykle daje się je odczytać (czyli sensownie wyświetlić lub odegrać) na większości komputerów, jeśli tylko zainstalowano na nich odpowiednie programy.

Plik binarny może też zawierać program komputerowy — wtedy zrozumiały jest tylko dla tego systemu operacyjnego, dla którego przeznaczony jest program. Na przykład program napisany dla MS Windows (którego nazwa kończy się zwykle na .exe) można uruchomić na każdym komputerze z (odpowiednią wersją) MS Windows. Nie da się go uruchomić pod żadnym innym systemem operacyjnym, np. MacOS czy GNU/Linux. Standardowe formaty plików graficznych, muzycznych, no i oczywiście tekstowych, powinny dać się wyświetlić na większości komputerów (jeśli zainstalowano odpowiednie programy).

Plik może też zawierać dane zapisane przez jakiś program w formacie niezgodnym z żadnym powszechnym standardem. Wtedy do ich odczytania potrzebny jest ten właśnie program (lub inny, potrafiący importować, czyli wczytywać, zapisane przez ten program dane). Dotyczy to również tekstów. Gdybyśmy pozostali przy treści, czyli samym tekście, wystarczyłby standard ASCII. Jednak coraz częściej nad treścią dominuje forma — w najprostszym liście trafia się często kilka różnych czcionek. Informacja o rozmiarach i rodzajach czcionek, jak również rozmieszczeniu tekstu na stronie, nie doczekała się standardowego formatu zapisu — producent każdego programu uważa swój format za jedynie słuszny. Jedynym dość rozpowszechnionym standardem jest oparty na ASCII rich text format (pliki *.rtf), jednak nie daje on tylu możliwości udziwniania tekstu, jak niestandardowe formaty różnych programów, stąd ograniczona popularność.


Ten sam ciąg bitów (plik) można interpretować na różne sposoby; na przykład 01000011010011110011111100111111 można odczytać jako:

odczyt interpretacja
01000011010011110011111100111111 trzydzieści dwa bity
0.747303187847137451 liczba rzeczywista (32-bitowa)
67 79 63 63 cztery liczby całkowite (8-bitowe)
C O ? ? litery (ASCII)
0100001101001111 0011111100111111 dwie „paczki" po szesnaście bitów
20291 16191 dwie liczby całkowite (16-bitowe)


Skoro z samych bitów trudno zgadnąć rodzaj pliku, pozostaje wykorzystać do tego celu nazwę. Końcowa część nazwy pliku, tradycyjnie oddzielana kropką, jest zwykle przeznaczona do określenia jego typu. Na przykład w nazwie sprawozdanie_z_maja.txt człon .txt, czyli rozszerzenie nazwy, oznacza typ pliku (tekstowy, zwykle ASCII). Właściwa nazwa, która powinna kojarzyć się z zawartością, to sprawozdanie_z_maja. Pliki z rozszerzeniem txt określamy często jako *.txt, gdzie * zastępuje dowolny ciąg znaków.

Rozszerzenia plików mogą być przez system kojarzone z konkretnymi programami, zdolnymi do wyświetlania i/lub edycji plików danego formatu. Stąd często kliknięcie pliku, którego rozszerzenie jest przez system skojarzone z obsługującym ten typ programem, wystarcza do uruchomienia odpowiedniego programu i otwarcia pliku. Poniżej przytaczamy niektóre standardowe rozszerzenia nazw plików:

pliki tekstowe                   *.txt, *.asc
obrazy	                         *.jpg, *.jpeg, *.gif, *.bmp, *.pcx, *.png
wideo	                         *.mpg, *.mpeg, *.avi
dźwięk	                         *.mp3, *.wav, *.au, *.mid
pliki TeX i LaTeX	         *.tex
źródła programów 	         *.c, *.pas, *.java...
pliki WWW	                 *.html, *.htm
programy MS Windows	         *.exe
Portable Document Format         *.pdf
archiwa skompresowanych plików   *.zip, *.rar, *.arj, *.gz, *.tgz, *.Z, *.tar.Z
pliki edytora tekstów MS Word    *.doc, *.docx
MS Excel (arkusz kalkulacyjny)	 *.xls, *.xlsx