Tipuri numerice

Sub aspect conceptual, datele care aparțin acestor tipuri sunt numere, asupra cărora pot fi aplicate operațiile aritmetice (adunare, scădere, înmulțire, împărțire) și operațiile de comparație aritmetică (mai mic, mai mare, egal, diferit de).

Din punct de vedere matematic, aceste date pot fi numere întregi sau reale. Existența mai multor tipuri în cadrul fiecăreia din aceste două categorii se datorește particularităților de reprezentare a datelor în memorie.

Tipurile de date numerice în Java sunt următoarele:

Inainte de a trece la studierea fiecărui tip de date în parte, vom prezenta unele operații care se aplică tuturor tipurilor de date numerice: atribuirea, conversia de tip, operatiile arițmetice și comparația. Exemple pentru aplicarea acestor operații se vor da la studierea diferitelor tipuri concrete de date numerice.

Operația de atribuire

Operația de atribuire se poate aplica tuturor tipurilor de date, deci și celor numerice. În expresia
    variabilă = expresie
daca variabila din partea stângă aparține unuia din tipurile numerice, atunci valoarea expresiei din partea dreaptă trebuie sa fie, de asemenea, numerică și să aibă un tip compatibil cu cel al variabilei din partea stângă. Prin tip compatibil înțelegem fie același tip cu cel al variabilei din stânga, fie un tip numeric care poate fi convertit implicit la acesta.
Dacă tipul operandului din dreapta este numeric, dar nu se convertește implicit la cel din stânga, se poate folosi conversia de tip explicită prin operatorul cast. În acest caz, însă, există pericolul ca valoarea să se altereze prin conversie.

Conversia de tip

Dacă este necesar, datele pot fi convertite dintr-un tip în altul. După caz, conversia se poate face implicit, sau poate fi cerută explicit prin program.

În limbajul Java, conversia de tip implicită se face atunci când prin conversie nu se pierde informație. De exemplu, dacă în expresia a=b variabila a este de tip int, iar b este de tip short sau byte, valoarea variabilei b va fi automat convertită la tipul int înainte de atribuire.
 
În tabela de mai jos sunt indicate cu X toate conversiile de tip care se pot realiza inplicit. În coloana din stânga este tipul datei care este supusa conversiei, iar în capul tabelei (pe prima linie) tipul către care se face conversia.
 
 
byte
short
int
long
float
double
byte
 
X
X
X
X
X
short
   
X
X
X
X
char
   
X
X
X
X
int
     
X
X
X
long
       
X
X
float
         
X

De exemplu, tipul int se poate converti implicit în oricare din tipurile long, float sau double, dar nu și în tipurile byte sau short.

Conversia de tip explicită se face prin operatorul unar numit cast, care are forma (tip), adică este format din numele tipului către care se face conversia, cuprins între paranteze. Acesta este un operator fără efect lateral, deci care nu modifică valoarea operandului. De exemplu, expresia (byte)a se va folosi pentru a converti valoarea operandului  a la tipul byte. Aceasta înseamnă că valoarea variabilei a rămâne neschimbată, însă valoarea expresiei (byte)a se obține din cea a lui a prin convertirea ei la tipul byte.

Utilizarea operatorului cast se justifică atunci când, în situația respectivă, conversia implicită nu este posibilă. Nu este însă greșit dacă folosim acest operator chiar și când conversia respectivă se poate face și implicit.
 
Utilizarea operatorului cast arată faptul că programatorul dorește să se faca o anumită conversie, chiar dacă prin aceasta se poate pierde informație. Asupra efectelor pe care care le are conversia explicită vom reveni la prezentarea diferitelor tipuri de date numerice.

Operațiile aritmetice

Operațiile aritmetice sunt cele care se aplică unor operanzi numerici, având ca rezultate tot numere. După numărul de operanzi, ele pot fi unare sau binare. Unele operații aritmetice unare au și efect lateral.

Tipul rezultatului operațiilor aritmetice depinde de tipul operanzilor și va fi discutat la fiecare din tipurile numerice în parte.

În exemplele de expresii din această secțiune, vom considera că a și b sunt doi operanzi  numerici.

În limbajul Java există următorii operatori aritmetici:

Operatori unari fără efect lateral:
 
Operator Exemplu de expresie Valoarea expresiei
+
+a
aceeași cu valoarea operandului
-
-a
valoarea operandului cu semn schimbat

Operatori unari cu efect lateral

Operatorii de incrementare ++ și decrementare -- au ca operanzi variabile numerice. Operatorul de incrementare ++ are ca efect lateral creșterea cu o unitate a valorii variabilei-operand, iar operatorul de decrementare -- are ca efect lateral micșorarea cu o unitate a acestei valori. Acest efect are loc indiferent dacă operatorul este plasat înaintea operandului sau după acesta. În schimb, poziția operatorului față de operand are importanță la stabilirea valorii expresiei rspective. Daca operatorul este plasat în fata operandului, operația de incrementare sau decremantare are loc înainte de a se stabili valoarea expresiei; dacă, însă, operatorul este plasat dupa operand, valoarea expresiei se stabilește înainte de a se face incrementarea sau decrementarea. Efectul operațiilor este prezentat în tabelul de mai jos.
 
Operator Expresie Operatie Valoarea expresiei Efect lateral
++
++a
preincrementare
a+1
valoarea variabilei a creste cu 1
++
a++
postincrementare
a
valoarea variabilei a creste cu 1
--
--a
predecrementare
a-1
valoarea variabilei a scade cu 1
--
a--
postdecrementare
a
valoarea variabilei a scade cu 1

Operatori binari

Operatorii binari nu au efect lateral - deci nu modifică valorile operanzilor -  și sunt dați în tabela de mai jos.
 
Operator Expresie Operatie Valoarea expresiei
+
a+b
adunare suma valorilor operanzilor
-
a-b
scadere diferenta valorilor operanzilor
*
a*b
inmultire produsul valorilor operanzilor
/
a/b
impartire catul (rezultatul impartirii) primului operand la al doilea
%
a%b
modulo restul impartirii intregi a primului operand la al doilea

Prin împărțire întreagă înțelegem împărțirea făcută astfel, încât câtul sa fie un număr întreg (fără extragerea părții fracționare (situate dupa virgulă).

Operații de atribuire compusă

Urmând tradiția limbajului C, în limbajul Java există și operatori de atribuire compusă, în care operația de atribuire este combinată cu una din operațiile aritmetice.

Operatorii de atribuire compusă sunt următorii: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=.
Se observă că fiecare din acești operatori are forma op în care op este un operator aritmetic binar. Expresia
    variabila op= operand
în care op este un operator aritmetic binar, este echivalentă cu expresia
    variabila = variabila op operand
și se evaluează astfel:
    - se calculează mai întâi valoarea expresiei (variabila op operand)în care variabila intră cu valoarea sa anterioară;
    - valoarea astfel calculată se atribuie ca noua valoare a variabilei din partea stânga. Aceasta nouaă valoare este, totodată, și valoare a expresiei.

Constatăm astfel că operatorii de atribuire compusă au efect lateral, la fel cu cei de atribuire.
 
Exemplu
Fie x=3.72 si y=0.19 două variabile de tip double. Expresia x+=y se calculeaza, la fel ca expresia x=x+y, în modul următor:
   - se calculează valoarea expresiei x+y, care este 3.91;
   - se atribuie variabilei x valoarea 3.91 (efectul lateral);
   - valoarea astfel atribuită (3.91) este considerată și drept valoare a expresiei x+=y.

Comparația

Comparațiile sunt operații binare fără efect lateral, în care se compară două numere, obținându-se ca rezultat o valoare de tip boolean. Operatorii prin care se efectuează comparația a două numere se numesc operatori relaționali și sunt dați în tabela de mai jos.
 
Operator Semnificatie
<
mai mic decât
<=
mai mic decât sau egal cu
>
mai mare decât
>=
mai mare decât sau egal cu
==
este egal cu
!=
este diferit de

Operatorii relaționali se aplică tuturor tipurilor de date numerice, inclusiv celor de tip char. Se permite ca cei doi operanzi sa fie de tipuri diferite, de exemplu să se compare o valoare de tip byte cu una de tip double sau cu una de tip char.

Să consideram, de exemplu, expresia a<b, unde a și b sunt operanzi de tipuri întregi. Dacă valoarea operandului a este mai mică decât cea a operandului b, atunci valoarea acestei expresii este true (adevărat). Dacă însă valoarea lui a nu este mai mică decât cea a lui b, ca rezultat se obține valoarea false (fals). Menționăm că valorile logice true și false sunt cele două valori ale tipului de date boolean



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