Typové přetypování v jazyce C: Implicitní a explicitní konverze

⚡ Chytré shrnutí

Přetypování v jazyce C převádí jeden datový typ na jiný, a to buď implicitně, když kompilátor automaticky zvolí menší kompatibilní typ, nebo explicitně, když programátor vynutí konverzi pomocí operátoru přetypování, aby řídil přesnost a zabránil neočekávaným výsledkům.

  • 🔄 Dvě formy: Implicitní přetypování se provádí automaticky; explicitní přetypování se zapisuje pomocí operátoru přetypování.
  • ⬆️ Typ propagace: Převod menšího typu na větší kompatibilní, například typu short na int, zachovává hodnotu.
  • ✂️ Riziko ztráty dat: Zúžení přetypování typu float na int zahodí zlomek a ztratí význam.
  • 🎯 Explicitní syntaxe: Zápis výrazu (název typu) vynutí konverzi, například přetypování celočíselných operandů na čísla s plovoucí čárkou.
  • 🤖 Asistence AI: Asistenti umělé inteligence a GitHub Copilot vytvářejí koncepty přetypování výrazů a označují riskantní zúžení konverzí.

Typové přetypování v jazyce C

Co je typování v C?

Typecasting je převod jednoho datového typu na jiný. V jazyce C se tomu také říká konverze dat nebo konverze typu. Je to jeden z důležitých konceptů zavedených v programování v jazyce C.

Programování „C“ poskytuje dva typy operací odlévání typu:

  • Implicitní typové obsazení
  • Explicitní typové obsazení

Implicitní typové obsazení

Implicitní přetypování znamená převod datových typů bez ztráty jejich původního významu. Tento typ přetypování je nezbytný, pokud chcete změnit datové typy beze změny významnosti hodnot uložených uvnitř. proměnlivý.

Konverze implicitního typu v C probíhá automaticky, když je hodnota zkopírována do jejího kompatibilního datového typu. Při převodu se uplatňují přísná pravidla pro převod typů. Pokud jsou operandy dvou různých datových typů, pak se operand s nižším datovým typem automaticky převede na vyšší datový typ. Tento typ převodu typu lze vidět v následujícím příkladu.

#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);
}

Výstup:

10
10

Implicitní typové obsazení

  1. V uvedeném příkladu jsme deklarovali proměnnou krátkého datového typu s hodnotou inicializovanou jako 10.
  2. Na druhém řádku jsme deklarovali proměnnou datového typu int.
  3. Na třetím řádku jsme do proměnné a přiřadili hodnotu proměnné s. Na třetím řádku se provede implicitní převod typu, kdy se hodnota z proměnné s, která je datového typu short, zkopíruje do proměnné a, která je datového typu int.

Převod znaku na Int

Zvažte příklad přidání znaku dekódovaného v ASCII s celým číslem:

#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 );
}

Výstup:

 Value of sum : 108

Zde kompilátor provedl celočíselnou propagaci převedením hodnoty 'k' na ASCII před provedením skutečné operace sčítání.

Hierarchie aritmetických konverzí

Kompilátor nejprve pokračuje s povýšením znaku na celé číslo. Pokud mají operandy stále různé datové typy, převedou se na nejvyšší datový typ, který se zobrazí v následujícím hierarchickém grafu:

Hierarchie aritmetických konverzí

Pro pochopení konceptu zvažte následující příklad:

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

Výstup:

 sum = 120.000000

Nejprve se proměnná c převede na celé číslo, ale kompilátor převede num a c na „float“ a sečte je, čímž vytvoří výsledek „float“.

Důležité body o implicitních konverzích

  • Implicitní typ konverze typu se také nazývá standardní konverze typu. Při přetypování implicitního typu nevyžadujeme žádná klíčová slova ani speciální příkazy.
  • Převod z menšího datového typu na větší datový typ se také nazývá povýšení typu. Ve výše uvedeném příkladu můžeme také říci, že hodnota s je povýšena na typ integer.
  • Implicitní převod typu se vždy provádí s kompatibilními datovými typy.

Nemůžeme provádět implicitní přetypování na datové typy, které nejsou vzájemně kompatibilní, jako například:

  1. Převodem float na int dojde ke zkrácení zlomkové části, čímž se ztratí význam hodnoty.
  2. Převodem double na float se číslice zaokrouhlí nahoru.
  3. Převod long int na int způsobí poklesping nadbytečných bitů vyššího řádu.

Ve všech výše uvedených případech, když převedeme datové typy, hodnota ztratí smysl. Ztráta významu hodnoty je obecně varována kompilátorem.

Programování "C". poskytuje další způsob přetypování, kterým je explicitní přetypování.

Explicitní typové obsazení

Při implicitní konverzi typu se datový typ převádí automaticky. Existují některé scénáře, ve kterých možná budeme muset vynutit konverzi typu. Předpokládejme, že máme proměnnou div, která ukládá rozdělení dvou operandů, které jsou deklarovány jako datový typ int.

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

V tomto případě po dělení provedeném na proměnných var1 a var2 bude výsledek uložený v proměnné „result“ v celočíselném formátu. Kdykoli k tomu dojde, hodnota uložená v proměnné „výsledek“ ztrácí svůj význam, protože nebere v úvahu zlomkovou část, která se běžně získá dělením dvou čísel.

Abychom v takových situacích vynutili konverzi typu, používáme explicitní přetypování.

Vyžaduje to operátora typového lití. Obecná syntaxe operací přetypování je následující:

(type-name) expression

Zde,

  • Název typu je standardní datový typ jazyka 'C'.
  • Výraz může být konstanta, proměnná nebo skutečný výraz.

Pojďme napsat program, který demonstruje, jak přetypovat v C s explicitním přetypováním.

#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;
}

Výstup:

Value of a is 1.200000
Value of b is 2

Explicitní typové obsazení

  1. Inicializovali jsme proměnnou 'a' typu float.
  2. Dále máme další proměnnou 'b' celočíselného datového typu. Protože proměnné 'a' a 'b' jsou různých datových typů, 'C' neumožní použití takového výrazu a vyvolá chybu. V některých verzích 'C' bude výraz vyhodnocen, ale výsledek nebude požadovaný.
  3. Abychom takovým situacím předešli, přetypovali jsme proměnnou 'a' typu float. Použitím explicitních metod přetypování jsme úspěšně převedli float na datový typ celé číslo.
  4. Vytiskli jsme hodnotu 'a', která je stále plovoucí
  5. Po přetypování bude výsledkem vždy celé číslo 'b.'

Tímto způsobem můžeme implementovat explicitní přetypování v programování C.

Nejčastější dotazy

Konverze typu je automatická změna kompilátoru; přetypování typu je explicitní změna, kterou požadujete pomocí operátoru přetypování. Přetypování je jednou z forem konverze.

Může. Převod typu float na celé číslo ořezává zlomek, převod typu double na celé číslo zaokrouhluje číslice a převod typu long na celé číslo zanechává vyšší bity. Rozšiřující přetypování zůstává bezpečné.

Ano. Jazyk C umožňuje převod jednoho typu ukazatele na jiný a ukazatele objektů se převádějí na typ void* a zpět. Dereferencování nekompatibilně převodovaného ukazatele způsobí nedefinované chování.

C má pouze přetypování hodnoty (typu) ve stylu C. C++ přidává čtyři bezpečnější pojmenované přetypování — static_cast, dynamic_cast, const_cast a reinterpret_cast — s jasnějším, kompilátorem ověřeným záměrem.

Hodnota si ponechává pouze bity nižšího řádu. Pokud je příliš velká, výsledek se zalomí nebo změní znaménko, proto nejprve zkontrolujte, zda odpovídá cílovému rozsahu.

Preferujte rozšiřující přetypování, před zúžením ověřte, zda hodnota odpovídá danému parametru, a před celočíselným dělením převeďte jeden operand na číslo s plovoucí desetinnou čárkou. Povolte varování kompilátoru pro označení rizikových převodů.

Ano. Asistent s umělou inteligencí zapisuje výrazy pro přetypování z promptu, vysvětluje pravidla pro povýšení a varuje, když může konverze ztratit data. Výsledek vždy zkompilujte a otestujte.

GitHub Copilot navrhuje implicitní a explicitní přetypovací výrazy z komentáře, včetně syntaxe (název-typu). RevPřed kompilací si prohlédněte každý návrh, zda nedošlo ke ztrátě dat.

Shrňte tento příspěvek takto: