Tipul char

Tipul de date char

Datele de tip char sunt caractere, adică simboluri tipografice elementare: litere, cifre, semne de punctuație, simboluri matematice, etc.

În limbajul Java, reprezentarea internă a caracterelor se face pe 2 octeți (16 biți), în sistemul Unicode. In acest sistem, caracterele sunt codificate în memoria internă prin numere întregi pozitive în intervalul [0, 65535]. În fluxurile de date de intrare/ieșire și în fișiere, caracterele pot fi reprezentate și în alte coduri. Codul cel mai frecvent folosit în aceste scopuri este ASCII, în care reprezentarea caracterelor se face pe un singur octet, deci prin numere întregi fără semn în intervalul [0, 255].

Remarcăm ca datele de tip char sunt singurul tip de date întregi fără semn din limbajul Java, mulțimea de valori a acestui tip de date fiind intervalul de numere naturale [0, 65535].

Reprezentarea externă a caracterelor se face în una din următoarele forme:
  a/ punând caracterul respectiv între apostrofuri: 'a', 'B', '+', '(', '3', etc;
  b/ folosind o secvență escape, în care apare codul numeric hexazecimal al caracterului respectiv, în Unicode, de ex: '\u006c' sau '\uffff'; într-o astfel de secvență, codul numeric al caracterului (format din patru cifre hexazecimale) este precedat de \u;
  c/ folosind o secventa escape pentru caracterele speciale din urmatorul tabel:
 
Caracterul
Reprezentarea in Unicode
Semnificatia
'\b'
'\u0008'
deplasare la stânga cu o poziție (backspace)
'\t'
'\u0009'
tabulare orizontală (horizontal tab)
'\n'
'\u000a'
trecere la linie nouă (line feed, NL)
'\f'
'\u000c'
salt la pagina nouă (form feed)
'\r'
'\u000d'
întoarcerea carului (carriage return, CR)
'\"'
'\u0022'
ghilimele (double quote)
'\''
'\u0027'
apostrof (single quote)
'\\'
'\u005c'
bară inversă (backslash)

Datele de tip char pot fi folosite în operații numerice, în care caz ele sunt interpretate drept numere intregi fără semn, conform cu reprezentarea lor internă prin numere binare. Din acest motiv, în limbajul Java datele de tip char sunt incluse în categoria celor de tipuri întregi.
 
În programele Java, secvențele escape pot fi folosite pentru a reprezenta caracterele în orice loc din textul sursa. Peste tot unde întâlnește în textul sursă caracterul \ (bara inversă, backslash), compilatorul consideră că urmeaza o secvență escape, pe care o înlocuiește cu caracterele Unicode corespunzătoare.
Exemplul 1
Șirul de caractere "abc\"def" conține secventa escape \", care se va inlocui cu codul caracterului ", obținându-se șirul abc"def. Acelasi șir de caractere putea fi scris sub forma "abc\u0022def", în care în loc de secvența escape \" s-a folosit direct cea care conține valoarea numerica din Unicode a caracterului ", respectiv \u0022.

Exemplul 2
Știind că reprezentările în Unicode ale literelor  e și  t sunt, respectiv,  \u0065 și  \u0074,  instrucțiunea 
    System.out.println("Exemplu"); 
poate fi scrisă sub forma 
    Sys\u0074\u0065m.ou\u0074.prin\u0074ln("Ex\u0065mplu"); 
Desigur că o astfel de înlocuire a caracterelor prin secvențe escape nu este justificată în cazul caracterelor obișnuite, dar este utilă în cazul folosirii caracterelor speciale, cum sunt caracterul de trecere la lini noua '\n' și altele.

Operații și operatori pentru date de tip char

În limbajul Java, tipul char este considerat tip de date întregi. În consecință, toate operațiile care se aplică tipurilor întregi se aplică și asupra tipului char. Atunci când un caracter se folosește ca numar întreg se operează, evident, cu reprezentarea internă a caracterului respectiv, tratată ca numar natural.

Exemplu
În programul de mai jos, dat in fișierul TestChar.java, se testează unele operații cu date de tip char.
 
/* Operatii cu date de tip char */

class TestChar {
  public static void main(String args[]) {
    char c1='A', c2='a', c3='b', c4='1', c5='*', c6='\n';
    System.out.println(c1+" "+c2+" "+c6+" "+c4+" "+c5+" "+c3);
    System.out.println((int)c1+" "+(int)c2+" "+(int)c6+" "+
      (int)c4+" "+(int)c5);
    System.out.println(c1+c2);
    System.out.println(c1*c2);
    System.out.println((char)107);
    System.out.println('2'+" "+(int)'2'+" "+'3'+" "+(int)'3'+
      " "+('2'+'3'));
  }
}

La executarea acestui program, rezultatele afișate pe ecran sunt cele de mai jos:
 
A a
 1 * b
65 97 10 49 42
162
6305
k
2 50 3 51 101
După afișarea caracterelor A și a s-a transmis către dispozitivul de afișare caracterul '\n', care a fost interpretat drept comanda de trecere la linie nouă. După aceasta au fost afșsate caracterele 1, * și b. Pe linia următoare sunt afișate caracterele deja afișate anterior, convertite în numere întregi. Se observă că în Unicode caracterul 'A' este reprezentat prin numarul 65, caracterul 'a' prin numarul 97, caracterul '\n' prin 10 etc.
Pe următoarele două linii sunt afișate rezultatele operațiilor 'c1'+'c2' si 'c1'*'c2', obținându-se respectiv valorile numerice 162 si 6305. Se observă că, întrucât caracterele au fost folosite ca operanzi ai unor operatori aritmetici, rezultatele obținute sunt numerice (de tip int).
Pe linia următoare se afișează numărul 107 convertit din int în char și interpretat deci drept 'k';
Pe ultima linie putem observa deosebirea dintre forma externă a caracterului (literalul de tip char) și codificarea lui interna. Literalul de tip char '2' este caracterul 2 si nu numarul 2. În consecință, acest caracter nu se reprezinta intern prin numarul întreg 2, ci prin numărul întreg 50. În mod corespunzator, caracterul '3' se reprezinta intern prin numarul 51. Suma codurilor numerice ale celor doua caractere este, evident, numărul 101.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați