|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
| Kod | NBC |
0 |
0000000 |
1 |
0000001 |
2 |
0000010 |
... |
... |
125 |
1111101 |
126 |
1111110 |
127 |
1111111 |
Jeśli kody ASCII zinterpretujemy jako liczby w kodzie NBC, to przyjmą one wartości od 0 do 127. Co nam to daje? Otóż bardzo wiele: komputery są maszynami matematycznymi, które potrafią przetwarzać liczby. Ponieważ kody ASCII są liczbami, to mogą być przetwarzane przez komputery jak inne liczby. Co więcej, liczby mogą być zapamiętywane w pamięci komputerowej, zatem komputer będzie mógł przechowywać znaki kodu ASCII w swojej pamięci.
Kod ASCII jest 7-bitowy, a komórka pamięci komputera jest 8-bitowa. Wynika z tego, iż jeden bit będzie niewykorzystywany:
| NBC | binarnie |
0 |
00000000
|
1 |
00000001
|
2 |
00000010
|
... |
... |
125 |
01111101
|
126 |
01111110
|
127 |
01111111
|
Początkowo nie miało to znaczenia, jednak później wraz z rozwojem komputerów postanowiono rozszerzyć standard ASCII do 8-bitów. W ten sposób otrzymano dodatkowe 128 kodów i powstał tzw. rozszerzony standard ASCII:
| U2 | NBC | binarnie |
0 |
0 |
00000000
|
1 |
1 |
00000001
|
2 |
2 |
00000010
|
... |
... |
... |
125 |
125 |
01111101
|
126 |
126 |
01111110
|
127 |
127 |
01111111
|
-128 |
128 |
10000000
|
-127 |
129 |
10000001
|
... |
... |
... |
-3 |
253 |
11111101
|
-2 |
254 |
11111110
|
-1 |
255 |
11111111
|
W efekcie kod ASCII otrzymał 28 = 256 słówek kodowych: 128 słówek standardowego kodu ASCII (kody NBS od 0 do 127) oraz drugie 128 słówek rozszerzonego kodu ASCII (kody NBS od 128 do 255 lub kody U2 od -1 do -128). Kody rozszerzone zostały wykorzystane do zakodowania dodatkowych znaków (np. znaki narodowe, litery greckie, symbole matematyczne, znaki do tworzenia tabelek oraz inne). Kody ASCII można również interpretować jako liczby ze znakiem U2. W takim przypadku kody podstawowe są dodatnie, a kody rozszerzone są ujemne (dlaczego?).
W języku C++ kod ASCII jest reprezentowany przez typ char (ang. character = znak). W pamięci komputera zmienna typu char zajmuje 1 bajt (8 bitów). Uruchom poniższy program:
| char: 1B |
Zmienna typu char przechowuje jeden znak ASCII.
| A |
Zwróć uwagę, iż w powyższym programie wpisaliśmy znak A do zmiennej a w apostrofach, a nie w cudzysłowach. Apostrofy oznaczają tutaj kod literki umieszczonej w nich. Cudzysłowy omówimy w dalszej części lekcji. Kod ten trafia do zmiennej a. Następnie wyświetlamy zawartość zmiennej. Ponieważ zmienna a ma typ char, to strumień cout interpretuje ją jako znak i wyświetla literę A. Gdybyśmy chcieli otrzymać kod tej literki (czyli liczbę), to stosujemy rzutowanie:
| 65 |
unsigned char – kody znaków interpretowane jako liczby NBS od 0 do 255. Kody podstawowe od 0 - 127, kody rozszerzone od 128 - 255
signed char – kody znaków interpretowane jako liczby U2 od -128 do 127. Kody podstawowe od 0 -127, kody rozszerzone od -1 do -128.
Jeśli zastosujemy sam typ char, to kody znaków będą interpretowane jako NBS lub U2 w zależności od ustawień kompilatora. Uruchom poniższy program:
| unsigned char: kod 'ą' = 185 signed char: kod 'ą' = -71 char: kod 'ą' = -71 |
Program wyświetla kod literki ą w zależności od rodzaju typu char. Literka ta należy do kodów rozszerzonych ASCII, dlatego przy interpretacji U2 otrzymujemy kod ujemny. Dodatkowo dostajesz informację o interpretacji typu char w twoim kompilatorze. Zapamiętaj ten wynik. Na przyszłość, jeśli kody rozszerzone ASCII będą istotne, to należy jawnie zastosować odpowiedni typ unsigned char (NBS) lub signed char (U2).
| Bitowo | |||||||
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
0 |
0 |
0 |
x |
x |
x |
x |
x |
Kody 0...31 posiadają specjalne znaczenie. Stosowano je dawniej do sterowania zewnętrznymi drukarkami. Dzisiaj z tych kodów wciąż używane są:
ABC1234 |
Program wyświetla dwa łańcuchy tekstowe: "ABC\0abcdefghijkl" oraz "1234". W pierwszym łańcuchu za literami ABC został wstawiony znak NUL - robi się to przy pomocy znaku pomocniczego \, za którym umieszczamy kod znaku zapisany w systemie ósemkowym. U nas \0 oznacza kod 0, czyli znak NUL. Gdy strumień cout napotka w tekście kod NUL, to przyjmuje, że tekst się w tym miejscu zakończył i dalsze znaki nie zostaną już wyświetlone. Dlatego drugi tekst został wyświetlony za literami ABC.
Kod 7: 00000111 – BEL, dzwonek. Znak generuje krótki sygnał dźwiękowy, dawniej drukarka po otrzymaniu kodu BEL uruchamiała dzwonek, aby zwrócić na coś uwagę operatora.
W tekście umieszczamy kod ósemkowy \7 lub symbolicznie \a.
Kod 8: 00001000 – BS, backspace, cofnięcie pozycji wydruku o jeden znak wstecz. Znak BS nie wymazuje wyświetlonych już znaków. Cofa jedynie pozycję wydruku, czyli miejsce, od którego komputer wyświetli następne znaki przesłane do strumienia cout.
ALA |
W tekście za literą O wstawiliśmy znak BS. Przy wydruku spowoduje to nadpisanie litery O literą A (ponieważ pozycja wydruku została cofnięta o jeden znak w lewo, czyli na pozycję litery O) i zamiast ALO otrzymamy ALA. Znak BS uzyskujemy przy pomocy kodu ósemkowego \10 lub symbolicznie \b.
Kod 9: 00001001 – HT, horizontal tab, ustawienie wydruku na pozycji następnej tabulacji. Tabulacje rozmieszczone są w wierszu w tych samych kolumnach co osiem znaków. Pozwala to na drukowanie np. tabel.
Znak HT uzyskujemy kodem ósemkowym \11 lub symbolicznie \t.
Kod 10: 00001010 – LF, line feed, dawniej znak ten powodował na drukarce przesunięcie pionowe papieru o jeden wiersz, co umożliwiało rozpoczęcie druku następnego. Dzisiaj zwykle oznacza on przesunięcie pozycji wydruku na początek nowego wiersza. W C ++ oznacza to samo, co manipulator endl.
ABC DEF GHI |
Znak LF uzyskujemy kodem ósemkowym \12 lub symbolicznie \n.
Kod 13: 00001101 – CR, carriage return, znak powoduje powrót pozycji wydruku na początek wiersza. Dawniej znak był stosowany wraz z LF, co powodowało wysunięcie papieru o jeden wiersz i ustawienie głowicy drukującej na początku nowego wiersza.
JKIDEF |
Program wypisuje w tym samym wierszu trzy teksty, ponieważ przed dwoma ostatnimi wstawiono kod CR, to wynikiem jest jeden tekst z nadpisanymi znakami. Znak CR uzyskujemy kodem ósemkowym \15 lub symbolicznie \r.
Pozostałe znaki w konsoli powodują wyświetlenie znaków graficznych, które czasem mogą być przydatne. Poniższy program wyświetla wszystkie znaki kontrolne ASCII:
kod: 0 Znak: NUL kod: 1 Znak: ☺ kod: 2 Znak: ☻ kod: 3 Znak: ♥ kod: 4 Znak: ♦ kod: 5 Znak: ♣ kod: 6 Znak: ♠ kod: 7 Znak: BEL kod: 8 Znak: BS kod: 9 Znak: HT kod: 10 Znak: LF kod: 11 Znak: ♂ kod: 12 Znak: ♀ kod: 13 Znak: CR kod: 14 Znak: ♫ kod: 15 Znak: ☼ kod: 16 Znak: ► kod: 17 Znak: ◄ kod: 18 Znak: ↕ kod: 19 Znak: ‼ kod: 20 Znak: ¶ kod: 21 Znak: § kod: 22 Znak: ▬ kod: 23 Znak: ↨ kod: 24 Znak: ↑ kod: 25 Znak: ↓ kod: 26 Znak: → kod: 27 Znak: ← kod: 28 Znak: ∟ kod: 29 Znak: ↔ kod: 30 Znak: ▲ kod: 31 Znak: ▼ |
W programie użyliśmy nowej instrukcji switch, która przydaje się, gdy należy podjąć różne działania w zależności od wartości wybranego wyrażenia. Składnia jest następująca:
Działanie instrukcji:
Komputer oblicza wartość wyrażenia. Jeśli jedna ze stałych za case ma wartość równą wartości wyrażenia, to komputer wykonuje instrukcje zawarte w tej sekcji case. Jeśli ostatnią z tych instrukcji jest break, to komputer kończy wykonanie switch. Jeśli nie ma instrukcji break, to następuje przejście do instrukcji w kolejnej sekcji case (czasem jest to pożądane, gdy chcemy wykonać te same operacje dla kilku wartości wyrażenia). Jeśli wartość wyrażenia nie odpowiada żadnej ze stałych za case, to komputer wykona instrukcje w sekcji default:. Przyjrzyjmy się, jak to działa w naszym programie:
for(int i = 0; i < 32; i++)
{
|
Rozpoczynamy pętlę, która wykona 32 obiegi z wartościami i od 0 do 31. Wartości te odpowiadają kodom sterującym ASCII. |
|
cout << "kod: "
<< setw(2) << i
<< " Znak: ";
|
Wyświetlamy wartość kodu znaku sterującego. | |
switch(i) |
Rozpoczynamy instrukcję switch. Sprawdzany w niej będzie kod wyświetlanego znaku. |
|
{
case 0: cout << "NUL"; break;
case 7: cout << "BEL"; break;
case 8: cout << "BS"; break;
case 9: cout << "HT"; break;
case 10: cout << "LF"; break;
case 13: cout << "CR"; break;
|
Ponieważ niektóre kody sterujące wykonują
działania w oknie konsoli i nie są znakami drukowalnymi, musimy je wyłapać. To właśnie robi tutaj instrukcja switch. Jeśli kod znaku jest równy jednej ze stałych za case, to do strumienia cout trafi nazwa kodu, a nie znak sterujący, który by zaburzył wyświetlaną treść. Zwróć uwagę, iż po przesłaniu do strumienia nazwy kodu pojawia się instrukcja break, która kończy działanie switch. Bez niej komputer przeszedłby do wykonywania instrukcji w następnym bloku case. |
|
default: cout << char(i); break; } |
Jeśli kod znaku nie jest równy żadnej ze
stałych za case, to nastąpi wykonanie instrukcji w sekcji default:. W tym wypadku kod sterujący nie wykonuje działania i jest normalnym znakiem, który przekazujemy do strumienia cout. Musimy wykonać rzutowanie na typ char, aby strumień zinterpretował wartość zmiennej i jako znak, a nie liczbę. |
|
cout << endl; } |
Po wyjściu z instrukcji switch
przesyłamy do strumienia manipulator endl, aby zakończyć bieżący wiersz |
kod: 32 Znak: SP kod: 33 Znak: ! kod: 34 Znak: " kod: 35 Znak: # kod: 36 Znak: $ kod: 37 Znak: % kod: 38 Znak: & kod: 39 Znak: ' kod: 40 Znak: ( kod: 41 Znak: ) kod: 42 Znak: * kod: 43 Znak: + kod: 44 Znak: , kod: 45 Znak: - kod: 46 Znak: . kod: 47 Znak: / kod: 48 Znak: 0 kod: 49 Znak: 1 kod: 50 Znak: 2 kod: 51 Znak: 3 kod: 52 Znak: 4 kod: 53 Znak: 5 kod: 54 Znak: 6 kod: 55 Znak: 7 kod: 56 Znak: 8 kod: 57 Znak: 9 kod: 58 Znak: : kod: 59 Znak: ; kod: 60 Znak: < kod: 61 Znak: = kod: 62 Znak: > kod: 63 Znak: ? |
W skład tej sekcji wchodzą znaki cyfr, których używamy do zapisu liczb. Poniższy program wyświetla kody cyfr szesnastkowo, ósemkowo i dziesiętnie:
Cyfra 0 : 0x30 : 060 : 48 Cyfra 1 : 0x31 : 061 : 49 Cyfra 2 : 0x32 : 062 : 50 Cyfra 3 : 0x33 : 063 : 51 Cyfra 4 : 0x34 : 064 : 52 Cyfra 5 : 0x35 : 065 : 53 Cyfra 6 : 0x36 : 066 : 54 Cyfra 7 : 0x37 : 067 : 55 Cyfra 8 : 0x38 : 070 : 56 Cyfra 9 : 0x39 : 071 : 57 |
Manipulatory hex (szesnastkowo), oct (ósemkowo) i dec (dziesiętnie) ustawiają sposób wyświetlania liczb w strumieniu cout. Dzięki nim nie musimy przeliczać wartości. Kody dwójkowe cyfr są następujące:
| Cyfra | Kod cyfry |
0 |
00110000
|
1 |
00110001
|
2 |
00110010
|
3 |
00110011
|
4 |
00110100
|
5 |
00110101
|
6 |
00110110
|
7 |
00110111
|
8 |
00111000
|
9 |
00111001
|
Zwróć uwagę, iż kody ASCII cyfr łatwo przerobić na wartości cyfr – wystarczy w kodzie ASCII wyzerować pierwsze cztery bity. Arytmetycznie odpowiada to odjęciu od kodu ASCII cyfry liczby 48 (001100002 = 4810). Również przetworzenie wartości cyfry na jej kod ASCII odpowiada dodaniu do jej wartości liczby 48:
Wartość cyfry = kod ASCII cyfry - 48 Kod ASCII cyfry = wartość cyfry + 48
Zwróć uwagę, iż kody ASCII małych liter są zawsze o 32 większe od kodów odpowiadających im dużych liter. Wynika stąd prosty sposób wymiany liter dużych i małych:
kod ASCII małej litery = kod ASCII dużej litery + 32 kod ASCII dużej litery = kod ASCII małej litery - 32
Podsumujmy podstawowe kody ASCII:
0...31 |
000xxxxx
|
kody sterujące |
32...63 |
001xxxxx
|
znaki pisarskie |
48...56 |
0011xxxx
|
cyfry |
64...95 |
010xxxxx
|
duże litery |
96...127 |
011xxxxx
|
małe litery |
Wybrane kody ASCII (nie musisz się ich uczyć na pamięć, ale w programowaniu zawsze warto je mieć pod ręką):
| Kod | Dwójkowo | Znak |
0: |
00000000 |
NUL |
7: |
00000111 |
BEL |
8: |
00001000 |
BS |
9: |
00001001 |
HT |
10: |
00001010 |
LF |
13: |
00001101 |
CR |
32: |
00100000 |
SP |
48: |
00110000 |
Cyfra 0 |
57: |
00111001 |
Cyfra 9 |
65: |
01000001 |
Litera A |
90: |
01011010 |
Litera Z |
97: |
01100001 |
Litera a |
122: |
01111010 |
Litera z |
127: |
01111111 |
DEL |
Kolejny program robi to samo, jednak najpierw przełącza w konsoli kodowanie LATIN-2 na CP-1250:
Jeśli porównamy wyniki pracy obu programów, to okaże się, iż kody polskich literek w obu kodach są inne. Zaznaczyliśmy je kolorem zielonym.
Niektóre kody w kodowaniu CP-1250 dają puste znaki, co zaburza wydruk. Zaznaczyliśmy je kolorem czerwonym.
|
LATIN-2
|
CP-1250
|
Porównanie polskich znaków w kodach LATIN-2 i CP-1250 wygląda następująco:
|
LATIN-2
|
CP-1250
|
Polskie znaki w obu kodach są ustawione nie po kolei, utrudnia to np. sortowanie alfabetyczne polskich wyrazów. Poniższa tabelka zawiera kody polskich znaków w obu systemach kodowania:
| Ą | Ć | Ę | Ł | Ń | Ó | Ś | Ź | Ż | |
LATIN-2 |
164 |
143 |
168 |
157 |
227 |
224 |
151 |
141 |
189 |
CP1250 |
165 |
198 |
202 |
163 |
209 |
211 |
140 |
143 |
175 |
| ą | ć | ę | ł | ń | ó | ś | ź | ż | |
LATIN-2 |
165 |
134 |
169 |
136 |
228 |
162 |
152 |
171 |
190 |
CP1250 |
185 |
230 |
234 |
179 |
241 |
243 |
156 |
159 |
191 |
| 0...31 | 32...63 | 64...95 | 96...127 | 128...255 |
| Znaki sterujące |
Znaki pisarskie |
Duże litery |
Małe litery |
Dodatkowe znaki |
| 48...57 | ||||
| Cyfry 0...9 |
Kod ASCII nie jest obecnie jedynym kodem w użyciu. Wnikliwym proponuję zapoznać się z artykułami:
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.