Conversii de tip
Conversiile de tip apar atunci cand in expresii exista operanzi de tipuri diferite sau anumite functii necesita parametrii de un anume tip.
Exista 3 tipuri de conversii de tip:
a) Conversii de tip aritmetice implicite;
b) Comversii de tip prin atribuiri;
c) Conversii de tip explicite.
Conversii aritmetice implicite
Conversiile aritmetice implicite au loc dupa un numar mic de reguli. C 959g68j onsiderand o expresie cu doi operanzi avem:
n daca unul din operanzi e double atunci celalalt este convertit la double si rezultatul va fi double;
n daca unul din operanzi este long (intr-o expresie cu numere intregi ) celalalt este convertit la long si rezultatul este long;
n daca unul din operanzi este unsigned , celalalt va fi convertit la unsigned si rezultatul va fi unsigned;
Tot ce e float e convertit la double . Rezulta ca toata aritmetica in virgula mobila se efectuaeaza in dubla precizie.
Daca intr-o expresie exista un operator * sau + si ca operanzi avem un intreg si un double atunci operandul de tip intreg se converteste la double si apoi se efectueaza operatia.
Exemplul 2.5.1.1.
char se converteste la int
Functia lower(c) converteste orice litera mare la litera mica . In rest caracterele raman nemodificate.
lower(c)
int c;
Observam in exemplul 2.5.1.1. ca apare o expresie aritmetica in care intervin coduri de caractere. In expresia din return totul se converteste la intreg dupa care se efectueaza operatiunile.
Conversii de tip prin atribuiri.
Aceste conversii au forma :
v = e
e va fi o expresie si v o variabila.
Tipul valorii membrului drept va fi convertit la tipul valorii membrului stang dupa urmatoarele reguli:
char int prin extindere de semn
int char bitii superiori sunt eliminati
int float se face conversia fara probleme , se va pastra valoarea dar numarul va fi in virgula mobila
float int conversia se face prin trunchierea partii fractionare
double float conversia se face prin rotunjire
long int conversia se face prin eliminarea bitilor de rang superior
Exemplul 2.5.2.1.
Conversia char int
#include "static.h"
main()
Codul caracterului A este 65 . Deci de la un octet la 2 octeti cat are variabila d se va completa cu zerouri.
Sa vedem ce se intampla cand in variabila caracter se memoreaza o valoare negativa (primul bit 1).
Exemplul 2.5.2.2.
Conversia char int cand primul bit al variabilei este 1
#include <stdio.h>
main()
Rezultatul tiparit este FFA0. Rezulta ca prin aceasta conversie se face extensie de semn deci toti cei 8 biti superiorivor fi 1.
Conversia intreg carcater si caracter intreg pentru numere mai mici decat 128 nu schimba cu nimic valoarea numarului.
Exemplul 2.5.2.3.
#include <stdio.h>
main()
Rezultatul tiparit va fi in ambele cazuri 27.
Conversii explicite
Aceste conversii au loc prin folosirea unei constructii numite distribuite si anume :
Exemplul 2.5.3.1.
(nume-tip) expresie
(double) x ; (long) x;
De exemplu , functiile trigonometrice sin , cos, tg, opereaza cu argumente de tip double . Rezulta ca pentru calculul unei functii care asteapta un argument real procedam astfel:
int n;
sin((double)n);
Argumentul n se va converti la double si se va calcula sinusul. Tipul lui n nu se schimba.
|