Typumwandlung in C: Implizite und explizite Konvertierung

⚡ Intelligente Zusammenfassung

Die Typumwandlung in C wandelt einen Datentyp in einen anderen um, entweder implizit, wenn der Compiler automatisch einen kleineren kompatiblen Typ auswählt, oder explizit, wenn ein Programmierer die Umwandlung mit einem Cast-Operator erzwingt, um die Genauigkeit zu kontrollieren und unerwartete Ergebnisse zu vermeiden.

  • 🔄 Zwei Formen: Implizite Typumwandlungen erfolgen automatisch; explizite Typumwandlungen werden mit einem Typumwandlungsoperator geschrieben.
  • ⬆️ Art der Promotion: Bei der Umwandlung eines kleineren Datentyps in einen größeren kompatiblen Datentyp, z. B. short in int, bleibt der Wert erhalten.
  • ️ Risiko von Datenverlust: Durch die Verengung von Typumwandlungen wie float zu int geht der Bruchteil verloren und die Bedeutung verfällt.
  • 🎯 Explizite Syntax: Die Schreibweise eines (Typname)-Ausdrucks erzwingt eine Konvertierung, beispielsweise die Umwandlung von Integer-Operanden in Float-Operanden.
  • 🤖 KI-Unterstützung: KI-Assistenten und GitHub Copilot entwerfen Cast-Ausdrücke und kennzeichnen riskante einschränkende Konvertierungen.

Typguss in C

Was ist Typecasting in C?

Typecasting ist die Konvertierung eines Datentyps in einen anderen. In der Programmiersprache C wird es auch Datenkonvertierung oder Typkonvertierung genannt. Es ist eines der wichtigen Konzepte, die in der C-Programmierung eingeführt wurden.

Die C-Programmierung bietet zwei Arten von Typumwandlungsvorgängen:

  • Implizites Typgießen
  • Explizite Typumwandlung

Implizites Typgießen

Implizite Typumwandlung bedeutet die Konvertierung von Datentypen, ohne deren ursprüngliche Bedeutung zu verändern. Diese Art der Typumwandlung ist unerlässlich, wenn Datentypen geändert werden sollen, ohne die Bedeutung der darin gespeicherten Werte zu verändern. Variable.

Implizite Typkonvertierungen in C erfolgen automatisch, wenn ein Wert in seinen kompatiblen Datentyp kopiert wird. Während der Konvertierung werden strenge Regeln für die Typkonvertierung angewendet. Wenn die Operanden zwei verschiedene Datentypen haben, wird ein Operand mit einem niedrigeren Datentyp automatisch in einen höheren Datentyp konvertiert. Diese Art der Typkonvertierung ist im folgenden Beispiel zu sehen.

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

Ausgang:

10
10

Implizites Typgießen

  1. Im gegebenen Beispiel haben wir eine Variable vom kurzen Datentyp deklariert, deren Wert mit 10 initialisiert wurde.
  2. In der zweiten Zeile haben wir eine Variable vom Datentyp int deklariert.
  3. In der dritten Zeile haben wir der Variablen a den Wert der Variablen s zugewiesen. In der dritten Zeile wird eine implizite Typkonvertierung durchgeführt, indem der Wert der Variablen s, die einen kurzen Datentyp hat, in die Variable a kopiert wird, die einen int-Datentyp hat.

Konvertieren von Zeichen in Int

Betrachten Sie das Beispiel des Hinzufügens eines in ASCII dekodierten Zeichens mit einer Ganzzahl:

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

Ausgang:

 Value of sum : 108

Hier hat der Compiler eine Ganzzahlerhöhung durchgeführt, indem er den Wert von „k“ in ASCII konvertiert hat, bevor die eigentliche Additionsoperation ausgeführt wurde.

Arithmetische Konvertierungshierarchie

Der Compiler wandelt zunächst ein Zeichen in eine Ganzzahl um. Wenn die Operanden immer noch unterschiedliche Datentypen haben, werden sie in den höchsten Datentyp konvertiert, der im folgenden Hierarchiediagramm erscheint:

Arithmetische Konvertierungshierarchie

Betrachten Sie das folgende Beispiel, um das Konzept zu verstehen:

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

Ausgang:

 sum = 120.000000

Zunächst wird die Variable c in eine Ganzzahl umgewandelt, aber der Compiler wandelt num und c in „float“ um und addiert sie, um ein „float“-Ergebnis zu erzeugen.

Wichtige Punkte zu impliziten Konvertierungen

  • Die implizite Typkonvertierung wird auch als Standardtypkonvertierung bezeichnet. Bei der impliziten Typumwandlung sind weder Schlüsselwörter noch spezielle Anweisungen erforderlich.
  • Die Umwandlung eines kleineren Datentyps in einen größeren wird auch als Typerweiterung bezeichnet. Im obigen Beispiel kann man sagen, dass der Wert von s in den Datentyp Integer erweitert wurde.
  • Die implizite Typkonvertierung erfolgt immer mit den kompatiblen Datentypen.

Wir können keine implizite Typumwandlung für Datentypen durchführen, die nicht miteinander kompatibel sind, wie zum Beispiel:

  1. Durch die Konvertierung von float in int wird der Bruchteil abgeschnitten, wodurch die Bedeutung des Werts verloren geht.
  2. Bei der Konvertierung von Double in Float werden die Ziffern aufgerundet.
  3. Die Umwandlung von long int in int führt zu einem Datenverlust.ping überschüssige höherwertige Bits.

In allen oben genannten Fällen verliert der Wert bei der Konvertierung der Datentypen seine Bedeutung. Im Allgemeinen wird der Bedeutungsverlust des Werts vom Compiler gewarnt.

'C'-Programmierung bietet eine weitere Möglichkeit der Typumwandlung, nämlich die explizite Typumwandlung.

Explizite Typumwandlung

Bei der impliziten Typkonvertierung wird der Datentyp automatisch konvertiert. Es gibt einige Szenarien, in denen wir möglicherweise eine Typkonvertierung erzwingen müssen. Angenommen, wir haben eine Variable div, die die Division zweier Operanden speichert, die als int-Datentyp deklariert sind.

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

In diesem Fall wird das in der Variable „result“ gespeicherte Ergebnis nach der Division der Variablen var1 und var2 im Integer-Format vorliegen. Wenn dies geschieht, verliert der in der Variable „result“ gespeicherte Wert seine Bedeutung, da er den Bruchteil nicht berücksichtigt, der normalerweise bei der Division zweier Zahlen entsteht.

Um in solchen Situationen die Typkonvertierung zu erzwingen, verwenden wir die explizite Typumwandlung.

Es ist ein Typumwandlungsoperator erforderlich. Die allgemeine Syntax für Typumwandlungsoperationen lautet wie folgt:

(type-name) expression

Dabei steht:

  • Der Typname ist der Standarddatentyp der Sprache „C“.
  • Ein Ausdruck kann eine Konstante, eine Variable oder ein tatsächlicher Ausdruck sein.

Lassen Sie uns ein Programm schreiben, um zu demonstrieren, wie eine Typumwandlung in C mit expliziter Typumwandlung durchgeführt wird.

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

Ausgang:

Value of a is 1.200000
Value of b is 2

Explizite Typumwandlung

  1. Wir haben eine Variable „a“ vom Typ float initialisiert.
  2. Als Nächstes haben wir eine weitere Variable 'b' vom Datentyp Integer. Da die Variablen 'a' und 'b' unterschiedliche Datentypen haben, lässt 'C' die Verwendung eines solchen Ausdrucks nicht zu und führt zu einem Fehler. In manchen 'C'-Versionen wird der Ausdruck zwar ausgewertet, das Ergebnis ist jedoch nicht erwünscht.
  3. Um solche Situationen zu vermeiden, haben wir die Variable „a“ vom Typ float typisiert. Mithilfe expliziter Typumwandlungsmethoden haben wir Float erfolgreich in den Datentyp Integer konvertiert.
  4. Wir haben den Wert „a“ gedruckt, der immer noch ein Float ist
  5. Nach der Typumwandlung ist das Ergebnis immer eine Ganzzahl „b“.

Auf diese Weise können wir eine explizite Typumwandlung in der C-Programmierung implementieren.

Häufig gestellte Fragen

Die Typkonvertierung ist die automatische Änderung durch den Compiler; die Typumwandlung ist die explizite Änderung, die Sie mit einem Cast-Operator anfordern. Casting ist eine Form der Konvertierung.

Das ist möglich. Die Umwandlung von float in int schneidet den Bruch ab, double in float rundet die Ziffern und long in int entfernt die höherwertigen Bits. Erweiterte Typumwandlungen bleiben sicher.

Ja. C erlaubt die Typumwandlung von einem Zeigertyp in einen anderen, und Objektzeiger lassen sich in void* und zurück konvertieren. Das Dereferenzieren eines inkompatibel umgewandelten Zeigers führt zu undefiniertem Verhalten.

C kennt nur die C-artige Typumwandlung (Typ)Wert. C++ Fügt vier sicherere benannte Typumwandlungen hinzu – static_cast, dynamic_cast, const_cast und reinterpret_cast – mit klarerer, vom Compiler geprüfter Intention.

Der Wert behält nur seine niederwertigen Bits. Ist er zu groß, wird das Ergebnis überschrieben oder ändert sein Vorzeichen. Prüfen Sie daher vorher, ob er in den Zielbereich passt.

Bevorzugen Sie Typumwandlungen mit zunehmender Typbreite, prüfen Sie vor der Typumwandlung, ob ein Wert passt, und wandeln Sie einen Operanden vor der Ganzzahldivision in eine Gleitkommazahl um. Aktivieren Sie Compilerwarnungen, um riskante Konvertierungen zu kennzeichnen.

Ja. Ein KI-Assistent generiert Typumwandlungsausdrücke anhand einer Eingabeaufforderung, erklärt die Regeln für die Typumwandlung und warnt vor möglichen Datenverlusten bei einer Konvertierung. Das Ergebnis sollte stets kompiliert und getestet werden.

GitHub-Copilot Schlägt implizite und explizite Typumwandlungsausdrücke aus einem Kommentar vor, einschließlich der Syntax (Typname). RevPrüfen Sie jeden Vorschlag auf möglichen Datenverlust, bevor Sie ihn kompilieren.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: