Conversia de tipuri în C: Conversie implicită și explicită

⚡ Rezumat inteligent

Conversia de tipuri în C convertește un tip de date în altul, fie implicit atunci când compilatorul promovează automat un tip compatibil mai mic, fie explicit atunci când un programator forțează conversia cu un operator de conversie pentru a controla precizia și a preveni rezultate neașteptate.

  • 🔄 Două forme: Convertirea implicită se execută automat; convertirea explicită este scrisă cu un operator de conversie.
  • ⬆️ Tip promoție: Conversia unui tip mai mic într-unul compatibil mai mare, cum ar fi short în int, păstrează valoarea.
  • ✂️ Risc de pierdere a datelor: Restrângerea distribuțiilor, cum ar fi float la int, elimină fracția și își pierde sensul.
  • 🎯 Sintaxă explicită: Scrierea expresiei (nume-tip) forțează o conversie, cum ar fi convertirea operanzilor întregi la număr float.
  • 🤖 Asistență AI: Asistenții AI și GitHub Copilot convertesc expresiile în format draft și semnalează conversiile riscante prin restrângere.

Tipărire în C

Ce este Typecasting în C?

Typecasting înseamnă convertirea unui tip de date în altul. Se mai numește și conversie de date sau conversie de tip în limbajul C. Este unul dintre conceptele importante introduse în programarea „C”.

Programarea „C” oferă două tipuri de operații de turnare de tip:

  • Casting de tip implicit
  • Casting de tip explicit

Casting de tip implicit

Conversia implicită a tipurilor de date înseamnă conversia tipurilor de date fără a pierde sensul original. Acest tip de conversie a tipurilor de date este esențial atunci când doriți să schimbați tipurile de date fără a schimba semnificația valorilor stocate în interiorul... variabil.

Conversia implicită a tipului în C are loc automat atunci când o valoare este copiată în tipul său de date compatibil. În timpul conversiei, se aplică reguli stricte pentru conversia tipului. Dacă operanzii sunt de două tipuri de date diferite, atunci un operand care are un tip de date mai mic este convertit automat într-un tip de date mai mare. Acest tip de conversie de tip poate fi văzut în exemplul următor.

#include<stdio.h>
int main(){
	short a=10; //initializing variable of short data type
	int b; //declaring int variable
	b=a; //implicit type casting
	printf("%d\n",a);
	printf("%d\n",b);
}

ieșire:

10
10

Casting de tip implicit

  1. În exemplul dat, am declarat o variabilă de tip de date scurte cu valoarea inițializată ca 10.
  2. Pe a doua linie, am declarat o variabilă de tip de date int.
  3. Pe a treia linie, am atribuit valoarea variabilei s variabilei a. Pe a treia linie conversia tip implicit este efectuată deoarece valoarea variabilei s, care este de tip scurt de date, este copiată în variabila a, care este de tip int.

Conversia caracterului în int

Luați în considerare exemplul de adăugare a unui caracter decodat în ASCII cu un număr întreg:

#include <stdio.h>
main() {
   int  number = 1;
   char character = 'k'; /*ASCII value is 107 */
   int sum;
   sum = number + character;
   printf("Value of sum : %d\n", sum );
}

ieșire:

 Value of sum : 108

Aici, compilatorul a făcut o promovare întreg prin conversia valorii lui 'k' în ASCII înainte de a efectua operația de adăugare reală.

Ierarhia de conversie aritmetică

Compilatorul continuă mai întâi cu promovarea unui caracter la un număr întreg. Dacă operanzii au încă tipuri de date diferite, atunci aceștia sunt convertiți la cel mai înalt tip de date care apare în următoarea diagramă ierarhică:

Ierarhia de conversie aritmetică

Luați în considerare următorul exemplu pentru a înțelege conceptul:

#include <stdio.h>
main() {
   int  num = 13;
   char c = 'k'; /* ASCII value is 107 */
   float sum;
   sum = num + c;
   printf("sum = %f\n", sum );}

ieșire:

 sum = 120.000000

În primul rând, variabila c este convertită în număr întreg, dar compilatorul convertește num și c în „float” și le adună pentru a produce un rezultat „float”.

Puncte importante despre conversiile implicite

  • Tipul implicit de conversie de tip este denumit și conversie de tip standard. Nu avem nevoie de niciun cuvânt cheie sau declarații speciale în castingul tip implicit.
  • Conversia de la un tip de date mai mic la un tip de date mai mare se numește și promovare de tip. În exemplul de mai sus, putem spune, de asemenea, că valoarea lui s este promovată la tipul întreg.
  • Conversia implicită a tipului are loc întotdeauna cu tipurile de date compatibile.

Nu putem efectua turnarea implicită a tipurilor pe tipuri de date care nu sunt compatibile între ele, cum ar fi:

  1. Conversia float într-un int va trunchia partea de fracție, pierzând astfel sensul valorii.
  2. Convertirea dublu în float va rotunji cifrele.
  3. Conversia unui număr lung de int în int va cauza o scădereping de biți de ordin superior în exces.

În toate cazurile de mai sus, atunci când convertim tipurile de date, valoarea își va pierde sensul. În general, pierderea sensului valorii este avertizată de compilator.

Programare „C”. oferă o altă modalitate de tipare, care este tipul explicit.

Casting de tip explicit

În conversia implicită a tipului, tipul de date este convertit automat. Există câteva scenarii în care ar putea fi nevoiți să forțăm conversia tipului. Să presupunem că avem o variabilă div care stochează împărțirea a doi operanzi care sunt declarați ca tip de date int.

 int result, var1=10, var2=3;
result=var1/var2;

În acest caz, după împărțirea efectuată pe variabilele var1 și var2 rezultatul stocat în variabila „rezultat” va fi într-un format întreg. Ori de câte ori se întâmplă acest lucru, valoarea stocată în variabila „rezultat” își pierde sensul deoarece nu ia în considerare partea de fracție care se obține în mod normal la împărțirea a două numere.

Pentru a forța conversia tipului în astfel de situații, folosim casting explicit de tip.

Este nevoie de un operator de turnare de tip. Sintaxa generală pentru operațiunile de turnare a tipului este următoarea:

(type-name) expression

Aici,

  • Numele tipului este tipul de date standard în limbajul „C”.
  • O expresie poate fi o constantă, o variabilă sau o expresie reală.

Haideți să scriem un program pentru a demonstra cum să tipați în C cu tipare explicită.

#include<stdio.h>
int main()
{
	float a = 1.2;
	//int b  = a; //Compiler will throw an error for this
	int b = (int)a + 1;
	printf("Value of a is %f\n", a);
	printf("Value of b is %d\n",b);
	return 0;
}

ieșire:

Value of a is 1.200000
Value of b is 2

Casting de tip explicit

  1. Am inițializat o variabilă „a” de tip float.
  2. În continuare, avem o altă variabilă „b” de tip întreg. Deoarece variabilele „a” și „b” au tipuri de date diferite, „C” nu va permite utilizarea unei astfel de expresii și va genera o eroare. În unele versiuni de „C”, expresia va fi evaluată, dar rezultatul nu va fi dorit.
  3. Pentru a evita astfel de situații, am tipizat variabila „a” de tip float. Folosind metode de turnare a tipului explicit, am convertit cu succes float în tipul de date întreg.
  4. Am tipărit valoarea „a”, care este încă un float
  5. După tipărire, rezultatul va fi întotdeauna un întreg „b”.

În acest fel, putem implementa turnarea de tip explicit în programarea C.

Întrebări frecvente

Conversia de tip este modificarea automată a compilatorului; convertirea de tip este modificarea explicită pe care o solicitați cu un operator de conversie. Convertirea este o formă de conversie.

Poate. Transformarea lui "float" la "int" trunchiază fracția, transformarea lui "double" la "float" rotunjește cifrele, iar transformarea lui "long" la "int" elimină biții de ordin superior. Convertările de lărgire rămân în siguranță.

Da. C vă permite să convertiți un tip de pointer la altul, iar pointerii la obiect se convertesc în void* și înapoi. Dereferențierea unui pointer convertit incompatibil provoacă un comportament nedefinit.

C are doar conversia de valoare (de tip) în stil C. C++ adaugă patru transformări denumite mai sigure — static_cast, dynamic_cast, const_cast și reinterpret_cast — cu o intenție mai clară, verificată de compilator.

Valoarea își păstrează doar biții de ordin inferior. Dacă este prea mare, rezultatul se încadrează în intervalul sau își schimbă semnul, așa că verificați mai întâi dacă se încadrează în intervalul țintă.

Preferați conversiile de lărgire, confirmați potrivirea unei valori înainte de a o restrânge și convertiți un operand la număr mobil înainte de împărțirea pe întregi. Activați avertismentele compilatorului pentru a semnala conversiile riscante.

Da. Un asistent cu inteligență artificială scrie expresii de conversie dintr-o solicitare, explică regulile de promovare și avertizează când o conversie ar putea pierde date. Compilați și testați întotdeauna rezultatul.

Copilotul GitHub sugerează expresii de conversie implicite și explicite dintr-un comentariu, inclusiv sintaxa (nume-tip). RevVizualizați fiecare sugestie privind posibilele pierderi de date înainte de compilare.

Rezumați această postare cu: