Rzutowanie typów w C: konwersja niejawna i jawna
⚡ Inteligentne podsumowanie
Rzutowanie typów w języku C polega na konwersji jednego typu danych na inny, albo niejawnie, gdy kompilator automatycznie promuje mniejszy, zgodny typ, albo jawnie, gdy programista wymusza konwersję za pomocą operatora rzutowania w celu kontrolowania precyzji i zapobiegania nieoczekiwanym wynikom.

Co to jest rzutowanie typów w C?
Rzutowanie typów to konwersja jednego typu danych na inny. W języku C nazywane jest również konwersją danych lub konwersją typów. Jest to jedna z ważnych koncepcji wprowadzonych w programowaniu w języku C.
W programowaniu w języku C dostępne są dwa typy operacji rzutowania typów:
- Niejawne rzutowanie typów
- Jawne rzutowanie typów
Niejawne rzutowanie typów
Niejawne rzutowanie typów oznacza konwersję typów danych bez utraty ich pierwotnego znaczenia. Ten typ rzutowania jest niezbędny, gdy chcesz zmienić typy danych bez zmiany znaczenia wartości przechowywanych w zmienna.
Niejawna konwersja typu w C następuje automatycznie, gdy wartość jest kopiowana do zgodnego typu danych. Podczas konwersji stosowane są ścisłe reguły konwersji typu. Jeśli operandy są dwóch różnych typów danych, operand o niższym typie danych jest automatycznie konwertowany na wyższy typ danych. Ten typ konwersji typu można zobaczyć w poniższym przykładzie.
#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); }
Wyjście:
10 10
- W podanym przykładzie zadeklarowaliśmy zmienną o krótkim typie danych, której wartość została zainicjowana jako 10.
- W drugiej linii zadeklarowaliśmy zmienną typu int.
- W trzeciej linii przypisaliśmy wartość zmiennej s zmiennej a. W trzeciej linii wykonywana jest niejawna konwersja typu, gdy wartość zmiennej s o typie krótkim jest kopiowana do zmiennej a o typie int.
Konwersja znaku na int
Rozważmy przykład dodania znaku dekodowanego w ASCII za pomocą liczby całkowitej:
#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 ); }
Wyjście:
Value of sum : 108
W tym przypadku kompilator wykonał promocję liczb całkowitych, konwertując wartość „k” na kod ASCII przed wykonaniem faktycznej operacji dodawania.
Hierarchia konwersji arytmetycznych
Kompilator najpierw przechodzi do promowania znaku do liczby całkowitej. Jeśli operandy nadal mają różne typy danych, są one konwertowane do najwyższego typu danych, który pojawia się w następującym schemacie hierarchii:
Aby zrozumieć tę koncepcję, rozważ poniższy przykład:
#include <stdio.h> main() { int num = 13; char c = 'k'; /* ASCII value is 107 */ float sum; sum = num + c; printf("sum = %f\n", sum );}
Wyjście:
sum = 120.000000
Najpierw zmienna c zostaje przekształcona na liczbę całkowitą, ale kompilator przekształca num i c na „float” i dodaje je, aby uzyskać wynik „float”.
Ważne uwagi dotyczące konwersji niejawnych
- Niejawna konwersja typu jest również nazywana konwersją typu standardowego. Nie wymagamy żadnych słów kluczowych ani specjalnych instrukcji w niejawnym rzutowaniu typów.
- Konwersja z mniejszego typu danych do większego typu danych jest również nazywana promocją typu. W powyższym przykładzie możemy również powiedzieć, że wartość s jest promowana do typu całkowitego.
- Niejawna konwersja typów zawsze odbywa się w przypadku zgodnych typów danych.
Nie możemy przeprowadzać ukrytego rzutowania typów danych na typy danych, które nie są ze sobą kompatybilne, takie jak:
- Konwersja float na int spowoduje obcięcie części ułamkowej, tracąc w ten sposób znaczenie wartości.
- Zamiana liczby podwójnej na zmiennoprzecinkową spowoduje zaokrąglenie cyfr.
- Konwersja long int na int spowoduje spadekping nadmiarowych bitów wyższego rzędu.
We wszystkich powyższych przypadkach, gdy dokonamy konwersji typów danych, wartość straci swoje znaczenie. Ogólnie rzecz biorąc, kompilator ostrzega o utracie znaczenia wartości.
Programowanie w języku „C”. zapewnia inny sposób rzutowania typów, który jest jawnym rzutowaniem typów.
Jawne rzutowanie typów
W niejawnej konwersji typu typ danych jest konwertowany automatycznie. Istnieją pewne scenariusze, w których możemy musieć wymusić konwersję typu. Załóżmy, że mamy zmienną div, która przechowuje dzielenie dwóch operandów, które są zadeklarowane jako typ danych int.
int result, var1=10, var2=3;
result=var1/var2;
W tym przypadku po dzieleniu wykonanym na zmiennych var1 i var2 wynik zapisany w zmiennej „result” będzie w formacie całkowitym. Za każdym razem, gdy to nastąpi, wartość zapisana w zmiennej „result” traci swoje znaczenie, ponieważ nie bierze pod uwagę części ułamkowej, która jest normalnie uzyskiwana przy dzieleniu dwóch liczb.
Aby wymusić konwersję typu w takich sytuacjach, używamy jawnego rzutowania typów.
Wymaga operatora rzutowania typu. Ogólna składnia operacji rzutowania typu jest następująca:
(type-name) expression
Tutaj,
- Nazwa typu jest standardowym typem danych języka „C”.
- Wyrażenie może być stałą, zmienną lub rzeczywistym wyrażeniem.
Napiszmy program demonstrujący, jak rzutować na typ w C z jawnym rzutowaniem typów.
#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; }
Wyjście:
Value of a is 1.200000 Value of b is 2
- Zainicjowaliśmy zmienną „a” typu float.
- Następnie mamy kolejną zmienną „b” o typie danych całkowitych. Ponieważ zmienne „a” i „b” mają różne typy danych, „C” nie zezwoli na użycie takiego wyrażenia i zgłosi błąd. W niektórych wersjach „C” wyrażenie zostanie obliczone, ale wynik nie będzie pożądany.
- Aby uniknąć takich sytuacji, rzutowaliśmy zmienną „a” typu float. Używając jawnych metod rzutowania typów, pomyślnie przekonwertowaliśmy liczbę zmiennoprzecinkową na liczbę całkowitą typu danych.
- Wydrukowaliśmy wartość „a”, która nadal jest liczbą zmiennoprzecinkową
- Po rzutowaniu wynikiem zawsze będzie liczba całkowita „b”.
W ten sposób możemy zaimplementować jawne rzutowanie typów w programowaniu C.



