Metode de codificare si stocare a informatiei folosite in tehnica de calcul
Dupa cum am aratat anterior, in binar se pot reprezenta direct numere intregi si fractionare fara semn[1]. Pentru a putea lucra cu numere cu semn precum si cu caractere alfanumerice, au fost concepute scheme de codificare a informatiei. Acestea trebuie sa raspunda unor cerinte uneori contradictorii, precum:
Nu exista o solutie unica care sa satisfaca toate aceste cerinte, si prin urmare se folosesc mai multe tipuri de codificare, adaptate pentru diverse situatii. Vom prezenta in cele ce urmeaza pe cele mai des folosite - dar atentie! mai sunt si altele!
Codificarea intregilor fara semn
Este direct reprezentarea in binar, pe 1 octet (8 biti), 2 octeti (16 biti), 4 octeti (32 biti) sau 8 octeti (64 biti).
In baza zece, numerele pot lua valori[2]:
0 255 |
|
pe 1 octet |
0 65,535 |
|
pe 2 octeti |
0 4,294,967,295 |
|
pe 4 octeti |
0 18,446,744,073,709,551,615 |
|
pe 8 octeti |
Codificarea BCD (Binary Coded Decimal)
Porneste de la ideea de a codifica cifrele prin conversia 09 direct in binar pe opt / patru biti. De exemplu, numarul 34099 se codifica ca:
3 |
4 |
0 |
9 |
9 |
0011 |
0100 |
0000 |
1001 |
1001 |
Exista doua moduri de a codifica BCD:
despachetat - pe un octet doar primii 4 biti contin codificarea unui cifre, urmatorii 4 contin 0000 binar
impachetat (packed BCD) - pe un octet se codifica doua cifre
Se observa ca pe octet o codificare packed BCD poate reprezenta valori de la 0 la 99, in timp ce o codificare binara "standard" poate reprezenta valori de la 0 la 255. Mai mult, o buna parte din combinatiile binare posibile pe octet sunt ilegale d.p.d.v. al codificarii BCD - deci trebuiesc construite circuite speciale logice (cu multe verificari si corectii) pentru o aritmetica corecta in BCD.
Reprezentarea intregilor cu semn
Prima idee este ca bitul cel mai din stanga sa fie 0 pentru numere pozitive, 1 pentru numere negative. Exista citeva metode de codificare:
O a doua idee este sa adunam la valoarea numarului un deplasament care sa asigure ca avem dupa codificare doar numere pozitive - codificarea in exces.
1. Cu bit de semn in fata (0 pozitiv, 1 negativ)
Numere pozitive |
Numere negative |
||
0 |
0 000 |
-0 |
1 000 |
1 |
0 001 |
-1 |
1 001 |
2 |
0 010 |
-2 |
1 010 |
3 |
0 011 |
-3 |
1 011 |
4 |
0 100 |
-4 |
1 100 |
5 |
0 101 |
-5 |
1 101 |
6 |
0 110 |
-6 |
1 110 |
7 |
0 111 |
-7 |
1 111 |
-1 |
1001 |
|
-1 |
|
1001 |
|
+2 |
0010 |
|
-1 |
|
1001 |
|
-4 |
1100 |
+1 |
0001 |
|
+(-7) |
|
1111 |
|
+7 |
0111 |
|
+(-2) |
|
1010 |
|
+3 |
0011 |
-2 |
1010 |
|
-0 |
1 |
1000 |
|
-1 |
1001 |
|
+3 |
1 |
0011 |
|
-7 |
1111 |
Numarul negativ se obtine punand pe 1 bitul cel mai din stanga. Concluzii:
2. Complement fata de 1
Numere pozitive |
Numere negative |
||
0 |
0 000 |
-0 |
1 111 |
1 |
0 001 |
-1 |
1 110 |
2 |
0 010 |
-2 |
1 101 |
3 |
0 011 |
-3 |
1 100 |
4 |
0 100 |
-4 |
1 011 |
5 |
0 101 |
-5 |
1 010 |
6 |
0 110 |
-6 |
1 001 |
7 |
0 111 |
-7 |
1 000 |
-1 |
1110 |
|
-1 |
|
1110 |
|
+2 |
0010 |
|
-1 |
|
1110 |
|
-4 |
1011 |
+1 |
0001 |
|
+(-7) |
|
1000 |
|
+7 |
0111 |
|
+(-2) |
|
1101 |
|
+3 |
0011 |
-0 |
1111 |
|
+6 |
1 |
0110 |
|
-6 |
1001 |
|
-4 |
1 |
1011 |
|
-1 |
1110 |
Numarul negativ se obtine prin negarea bitilor din codificarea numarului pozitiv.
Concluzii:
3. Complement fata de 2
Numere pozitive |
Numere negative |
||
0 |
0 000 |
-0 |
0 000 |
1 |
0 001 |
-1 |
1 111 |
2 |
0 010 |
-2 |
1 110 |
3 |
0 011 |
-3 |
1 101 |
4 |
0 100 |
-4 |
1 100 |
5 |
0 101 |
-5 |
1 011 |
6 |
0 110 |
-6 |
1 010 |
7 |
0 111 |
-7 |
1 001 |
|
|
-8 |
1 000 |
-1 |
|
1111 |
|
-2 |
|
1110 |
|
+2 |
0010 |
|
-1 |
|
1111 |
|
-4 |
1100 |
+1 |
|
0001 |
|
+(-7) |
|
1001 |
|
+7 |
0111 |
|
+(-2) |
|
1110 |
|
+3 |
0011 |
0 |
1 |
0000 |
|
+7 |
1 |
0111 |
|
-7 |
1001 |
|
-3 |
1 |
1101 |
|
-1 |
1111 |
Numarul negativ se obtine prin negarea bitilor din codificarea numarului pozitiv, la care se aduna 1
O alta metoda de obtinere a complementului fata de 2 se face prin urmatoarea succesiunea de pasi:
a) pentru reprezentarea pe n biti se calculeaza 2n
b) se scade numarul care trebuie reprezentat din valoarea obtinta la pasul a)
c) se converteste in binar rezultatul de la pasul b)
Concluzii:
4. Prin adunarea unui deplasament pozitiv (reprezentare in exces)
Numere negative |
Codificare - exces 7 |
Numere pozitive |
Codificare - exces 7 |
-7 |
00 00 |
+0 |
01 11 |
-6 |
00 01 |
+1 |
10 00 |
-5 |
00 10 |
+2 |
10 01 |
-4 |
00 11 |
+3 |
10 10 |
-3 |
01 00 |
+4 |
10 11 |
-2 |
01 01 |
+5 |
11 00 |
-1 |
01 10 |
+6 |
11 01 |
-0 |
01 11 |
+7 |
11 10 |
|
|
+8 |
11 11 |
Numarul negativ cel mai mic este codificat 00..00 si este in modul valoarea "exces". Secventa de numere se construieste adunand binar 1 la numarul anterior. Concluzii:
Prezentam mai jos rezultatele operatilor de adunare pe numere codificate "exces 7".
-1 |
0110 |
|
-2 |
0101 |
|
+2 |
|
1001 |
|
-1 |
0110 |
|
-4 |
0011 |
|||||||||
+1 |
1000 |
|
+(-7) |
0000 |
|
+7 |
|
1110 |
|
+(-2) |
0101 |
|
+3 |
1010 |
|||||||||
+7 |
1110 |
|
-2 |
0101 |
|
-7 |
1 |
0111 |
|
+4 |
1011 |
|
+6 |
1101 |
|||||||||
|
|||||||||||||||||||||||
Pentru corectie, scadem binar din rezultatul de mai sus 0111 (codificarea valorii 0) |
|||||||||||||||||||||||
|
1110 |
|
|
|
0101 |
|
|
|
0111 |
|
|
1011 |
|
|
1101 |
||||||||
-0 |
0111 |
|
-0 |
|
1111 |
|
-0 |
|
0111 |
|
-0 |
0111 |
|
-0 |
0111 |
||||||||
0 |
0111 |
|
+3 |
1 |
0110 |
|
-7 |
|
0000 |
|
-3 |
0100 |
|
-1 |
0110 |
||||||||
Reprezentarea caracterelor alfanumerice - codul ASCII
ASCII stands for American Standard Code for Information Interchange. Computers can only understand numbers, so an ASCII code is the numerical representation of a character such as 'a' or '@' or an action of some sort. ASCII was developed a long time ago and now the non-printing characters are rarely used for their original purpose. Below is the ASCII character table and this includes descriptions of the first 32 non-printing characters. ASCII was actually designed for use with teletypes and so the descriptions are somewhat obscure. If someone says they want your CV however in ASCII format, all this means is they want 'plain' text with no formatting such as tabs, bold or underscoring - the raw format that any computer can understand. This is usually so they can easily import the file into their own applications without issues. Notepad.exe creates ASCII text, or in MS Word you can save a file as 'text only' |
|||||||||||||||||||||
|
|||||||||||||||||||||
Primele 32 de coduri corespund unor caractere netiparibile, denumite caractere de control (pentru imprimanta sau display). Din pacate, acelasi caracter de control trimis catre periferice diferite poate avea efecte diferite (motiv: lipsa de standardizare dintre periferice) - deci consultati documentatia aferenta perifericului! Nici macar comportamentul intre diverse sisteme de operare nu este consistent, astfel o linie de text se termina:
Al doilea grup de 32 de coduri este folosit pentru a reprezenta semnele de punctuatie, caracterele speciale si cifrele. De exemplu, cifra 5 este codificata ca 35h, adica 0011 0101. Al treilea grup de 32 de coduri este folosit pentru a reprezenta literele mari si (cum in engleza sunt doar 26 de litere) si unele semne speciale. De exemplu:
Al patrulea grup de 32 de coduri sunt foloite pentru a reprezenta literele mici, caractere speciale si inca un caracter de control (delete). Exemple:
Observam cateva caracteristici ale codificarii ASCII:
Prezentam mai jos codificarea primelor 32 de caractere ASCII. |
|||||||||||||||||||||
|
Hexa |
Simbol |
Descriere |
00 |
NUL (null) |
|
01 |
SOH (start of heading) |
|
02 |
STX (start of text) |
|
03 |
ETX (end of text) |
|
04 |
EOT (end of transmission) |
diferit de ETB |
05 |
ENQ (enquiry) |
|
06 |
ACK (acknowledge) |
|
07 |
BEL (bell) |
Pe un terminal teletype suna clopotelul. Pe multe terminale sau programe de emulare terminal scoate un "beep". |
08 |
BS (backspace) |
Muta cursorul (sau capul de tiparire) inapoi (spre stanga) un spatiu. |
09 |
TAB (horizontal tab) |
Muta cursorul (sau capul de tiparire) spre dreapta pe urmatoarea pozitie de tabulare. Pozitionarea depinde de perifericul de iesire, dar este adesea la 8 sau 10 spatii. |
0A |
LF (NL line feed, new line) |
Muta cursorul (sau capul de tiparire) pe o linie noua. Pe sisteme Unix muta pe o linie noua SI la inceput de rand in extrema stanga.. |
0B |
VT (vertical tab) |
|
0C |
FF (form feed) |
Avanseaza hartia la inceputul paginii urmatoare (deca dispozitivul de iesire este o imprimanta) |
0D |
CR (carriage return) |
Muta cursorul complet in partea stanga, dar NU avanseaza la linia urmatoare. |
0E |
SO(shift out) |
Trece dispozitvul de iesire pe setul alternat de caractere. |
0F |
SI (shift in) |
Trece dispozitvul de iesire pe setul de baza de caractere. |
10 |
DLE (data link escape) |
|
11 |
DC1 (device control 1) |
|
12 |
DC2 (device control 2) |
|
13 |
DC3 (device control 3) |
|
14 |
DC4 (device control 4) |
|
15 |
NAK (negative acknowledge) |
|
16 |
SYN (synchronous idle) |
|
17 |
ETB (end of transmission block) |
Diferit de EOT |
18 |
CAN (cancel) |
|
19 |
EM (end of medium) |
|
1A |
SUB (substitute) |
|
1B |
ESC (escape) |
|
1C |
FS (file separator) |
|
1D |
GS (group separator) |
|
1E |
RS (record separator) |
|
1F |
US (unit separator) |
|
EBCDIC
ASCII is not the only format in use out there. IBM adopted EBCDIC (Extended Binary Coded Decimal Interchange Code) developed for punched cards in the early 1960s and still uses it on mainframes today. It is probably the next most well known character set due to the proliferation of IBM mainframes. It comes in at least six slightly differing forms, so again here is the most common.
Unicode Tables v4
Ascii was very simplistic, and so was extended by adding 'extended' sets by various manufacturers. Apart from being confusing this was still restricted to 256 characters. Now computers are more widely established around the world the need to show other characters such as Japanese and Chinese languages along with various symbols became more important. Unicode is an attempt to standardise every character possible and the latest version (4) is shown below. Tables are in PDF format so you will need Adobe Acrobat Reader to view them.
|
|
Oriya |
Osmanya |
Runic |
Shavian |
Sinhala |
Syriac |
Tagalog |
Tagbanwa |
Tai Le |
Tamil |
Telugu |
Thaana |
Thai |
Tibetan |
Ugaritic |
Yi Radicals |
Yi Syllables |
Combining Diacritical Marks |
Spacing Modifier Letters |
Bopomofo |
Bopomofo Extended |
CJK Compatibility |
CJK Compatibility Forms |
CJK Compatibility Ideographs |
CJK Compatibility Ideographs Supplement |
CJK Radicals Supplement |
CJK Symbols and Punctuation |
CJK Unified Ideographs |
CJK Unified Ideographs Extension A |
CJK Unified Ideographs Extension B |
Enclosed CJK Letters and Months |
Hangul Compatibility Jamo |
Hangul Jamo |
Hangul Syllables |
Hiragana |
Ideographic Description Characters |
Kanbun |
KangXi Radicals |
Katakana |
Katakana Phonetic Extensions |
Sunt preluate cateva fisiere in directorul unicode latin
Reprezentarea numerelor reale in virgula mobila
Se porneste de la ideea ca 39.75 poate fi reprezentat ca 0.3975*102, deci un exponent (2), o mantisa (3975) si o baza (10). Mantisa este intotdeauna un numar subunitar (cu prima pozitie diferita de 0), exponentul poate fi negativ sau pozitiv, iar numarul ca atare poate fi pozitiv sau negativ.
Pentru codificarea numerelor in virgula mobila se folosesc 3 formate:
Format |
bit semn |
biti exponent |
biti mantisa |
simpla precizie pe 32 biti |
1 |
8 |
23 |
dubla precizie pe 64 biti |
1 |
11 |
52 |
real temporar pe 80 biti |
1 |
15 |
64 |
Indiferent de format, sunt comune urmatoarele caracteristici:
Sa facem pasii succesivi o codificare in simpla precizie pe 32 biti. Primul pas consta in reprezentarea numarului real in binar: de pilda 41.75=(32+8+1).(1/2 + 1/4) = 101001.11 Procedand ca mai sus, il putem rescrie ca 0.10100111*26, deci exponentul este 2, mantisa este 1010011, iar baza este 2. Pentru a codifica acest numar real in virgula mobila pe 32 biti se aplica succesiv urmatorii pasi:
a) bitul cel mai din stanga este semnul numarului (0 pentru numere pozitive, 1 pentru numere negative)
b) pe urmatorii 8 biti se codifica exponentul in exces 127 - deci 6+127 = 133 = 10000101
c) pe urmatorii 23 de biti se scrie mantisa (mai putin primul bit care este oricum 1), completata la dreapta cu 0
41.75
Semn |
Exponent |
Mantisa |
Observatii |
0 |
10000101 |
010011100000 00000000000 |
|
0100001 010100111 0000000 000000000 |
in binar |
||
42A70000 |
in hexa |
Alte exemple:
-3.5
-3.5 este -11.1 sau .111*21 |
semn: |
1 |
|
|
|
exponent: 1+127 |
|
10000000 |
|
|
mantisa: 111 |
|
|
110000000000 00000000000 |
Sir complet in binar |
1 1000000011 000000000 000000000000 |
|||
Sir complet in hexa |
C0600000 |
+3.5
+3.5 este 11.1 sau .111*21 |
semn: |
0 |
|
|
|
exponent: 1+127 |
|
10000000 |
|
|
mantisa: 111 |
|
|
110000000 00000000000000 |
Sir complet in binar |
0 100000001100000 000000000 0000000 |
|||
Sir complet in hexa |
40600000 |
[1] reprezentarea este exacta daca partea fractionara este compusa doar din puteri negative ale lui 2, cu aproximatie daca partea fractionara nu se descompune exact in puteri negative ale lui 2.
[2] atentie: virgula este separator intre mii !
[3] Atentie: acest mecanism functioneaza corect doar pentru un octet! 123 se codifica ASCII ca 31h 32h 33h, deci scaderea 30h pe fiecare octet va duce la secventa de biti 01h 02h 03h - adica 0000 0001 0000 0010 0000 0011, total diferita de corectul 7Bh, adica 111 1011
[4] reprezentarea in exces are avantajul ca permite codificarea numerelor intregi cu semn fara a aloca un bit special pentru acesta