C lengoaiak adierazpen berean datu-mota ezberdineko gaiak agertzea ahalbidetzen du, konpiladorea arduratzen da eragiketak behar bezala egiteaz. Adierazpen berean bi datu-mota edo gehiago agertzen direnean, eragigai guztien datu-motak bihurtzen ditu C lengoaiaren konpiladoreak eragigaietan dagoen datu-motarik handienera, honako bi arau hauen arabera:
- char eta short int guztiak int bihurtzen dira, float guztiak double bihurtzen dira
- Eragigai pare guztietarako, honako hau sekuentzian gertatzen da:
- Eragigaietako bat long double bada, bestea long double bihurtzen da
- Eragigaietako bat double bada, bestea double bihurtzen da
- Eragigaietako bat long bada, bestea long bihurtzen da
- Eragigaietako bat unsigned bada, bestea unsigned bihurtzen da.
Konpiladoreak bihurketa-arau horiek aplikatu ondoren, eragigaiak datu-mota berekoak izango dira, eta emaitza eragigaien datu-motako horretakoa izango da. Adibide bat ikus dezagun:
char cKarak; int iKop; float fZbk; double dZbk; ( cKarak / iKop ) - ( fZbk + iKop ) + ( fZbk * dZbk ) ; char int float int float double
Adierazpen aritmetikoan datu-mota desberdinak daudelako, lehenengo araua aplikatuko da. Lehenengo arauaren arabera, char datu-motako cKarak aldagaiaren balioa int bihurtzen da, eta, era berean, float datu-motako fZbk aldagaiaren balioa double bihurtzen da. Egoera berria hau delarik:
( cKarak / iKop ) - ( fZbk + iKop ) + ( fZbk * dZbk ) ; int int double int double double
Hiru blokeak ikus ditzagun banan-banan. Lehen blokeko bi eragigaiak mota berekoak direnez, lehenengo eragiketa egingo dugu (cKarak/iKop), eta emaitza int datu-motakoa izango da. Era berean, hirugarren blokeko eragiketan bi biderkagaiak datu-mota berekoak direnez fZbk*dZbk eragiketa burutuko da emaitza double datu-motakoa delarik. Baina, bigarren blokeko batugaiak datu-mota desberdinekoak dira, horregatik, bigarren araua aplikatuz int datu-motakoa double datu-motara bihurtzen da eta fZbk+iKop emaitza double izango da.
( cKarak / iKop ) - ( fZbk + iKop ) + ( fZbk * dZbk ) ; int int double int double double ------------- ------------- --------------- int double double
Hiru blokeak ebaluatu ondoren, haien integrazioa egin beharko da. Lehen blokea int datu-motakoa izango denez, eta bigarren blokea double datu-motakoa denez, lehen blokeari bihurketa bat egiten zaio double izan dadin eta bi bloken arteko kendura double datu-motakoa izango da. Amaitzeko hirugarren blokea gehituko zaio aurreko emaitzari eta biak double datu-motakoak direnez azken emaitza ere double izango da.
( cKarak / iKop ) - ( fZbk + iKop ) + ( fZbk * dZbk ) ; int int double int double double ------------- ------------- --------------- int double double --------------------------- double double ----------------------------------------- double
iruzkinik ez:
Argitaratu iruzkina