Преобразуване на типове в C: Имплицитно и експлицитно преобразуване

⚡ Умно обобщение

Преобразуването на типове в C преобразува един тип данни в друг, или имплицитно, когато компилаторът автоматично преобразува по-малък съвместим тип, или изрично, когато програмистът налага преобразуване с оператор за преобразуване, за да контролира точността и да предотврати неочаквани резултати.

  • 🔄 Две форми: Имплицитното преобразуване се изпълнява автоматично; експлицитното преобразуване се записва с оператор за преобразуване.
  • ⬆️ Тип промоция: Преобразуването на по-малък тип в по-голям съвместим, като например short в int, запазва стойността.
  • ✂️ Риск от загуба на данни: Стесняването на преобразуванията като float към int пропуска дробта и губи смисъл.
  • 🎯 Изричен синтаксис: Записването на израз (име на тип) принуждава преобразуване, подобно на преобразуването на целочислени операнди в числа с плаваща запетая.
  • 🤖 AI помощ: AI асистентите и GitHub Copilot изготвят изрази за преобразуване и маркират рискови стесняващи преобразувания.

Преобразуване на типове в C

Какво е Typecasting в C?

Typecasting е преобразуване на един тип данни в друг. Нарича се още преобразуване на данни или преобразуване на тип на езика C. Това е една от важните концепции, въведени в програмирането на C.

Програмирането на „C“ предоставя два типа операции за преобразуване на типове:

  • Неявно кастинг на типове
  • Изрично кастинг на типове

Неявно кастинг на типове

Имплицитното преобразуване на типове означава преобразуване на типове данни без загуба на първоначалното им значение. Този тип преобразуване на типове е от съществено значение, когато искате да промените типовете данни, без да променяте значимостта на стойностите, съхранявани вътре. променлив.

Неявното преобразуване на тип в C се случва автоматично, когато дадена стойност се копира в нейния съвместим тип данни. По време на преобразуването се прилагат строги правила за преобразуване на типа. Ако операндите са от два различни типа данни, тогава операнд с по-нисък тип данни автоматично се преобразува в по-висок тип данни. Този тип преобразуване на типове може да се види в следния пример.

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

Изход:

10
10

Неявно кастинг на типове

  1. В дадения пример сме декларирали променлива от кратък тип данни със стойност, инициализирана като 10.
  2. На втория ред сме декларирали променлива от тип данни int.
  3. На третия ред сме присвоили стойността на променливата s на променливата a. На третия ред се извършва имплицитно преобразуване на тип, тъй като стойността от променлива s, която е от кратък тип данни, се копира в променливата a, която е от int тип данни.

Преобразуване на символ в Int

Разгледайте примера за добавяне на знак, декодиран в ASCII с цяло число:

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

Изход:

 Value of sum : 108

Тук компилаторът е направил целочислена промоция, като е преобразувал стойността на 'k' в ASCII, преди да извърши действителната операция за събиране.

Йерархия на аритметично преобразуване

Компилаторът първо продължава с повишаване на знака до цяло число. Ако операндите все още имат различни типове данни, тогава те се преобразуват в най-високия тип данни, който се появява в следната йерархична диаграма:

Йерархия на аритметично преобразуване

Разгледайте следния пример, за да разберете концепцията:

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

Изход:

 sum = 120.000000

Първо, променливата c се преобразува в цяло число, но компилаторът преобразува num и c в „float“ и ги сумира, за да получи резултат „float“.

Важни точки относно неявните преобразувания

  • Неявният тип преобразуване на тип се нарича още стандартно преобразуване на тип. Ние не изискваме ключови думи или специални изрази при имплицитно преобразуване на типове.
  • Преобразуването от по-малък тип данни в по-голям тип данни се нарича още повишение на типа. В горния пример можем също да кажем, че стойността на s се повишава до тип цяло число.
  • Неявното преобразуване на тип винаги се случва със съвместимите типове данни.

Не можем да извършим имплицитно преобразуване на типове на типове данни, които не са съвместими един с друг, като например:

  1. Преобразуването на float в int ще отреже дробната част, като по този начин ще загуби значението на стойността.
  2. Преобразуването на double в float ще закръгли цифрите.
  3. Преобразуването на long int в int ще доведе до изпусканеping на излишни битове от висок порядък.

Във всички горепосочени случаи, когато конвертираме типовете данни, стойността ще загуби значението си. Обикновено загубата на смисъл на стойността се предупреждава от компилатора.

"C" програмиране предоставя друг начин за преобразуване на типове, който е изрично преобразуване на типове.

Изрично кастинг на типове

При имплицитно преобразуване на тип, типът данни се преобразува автоматично. Има някои сценарии, при които може да се наложи да принудим преобразуването на типа. Да предположим, че имаме променлива div, която съхранява разделянето на два операнда, които са декларирани като int тип данни.

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

В този случай, след извършеното разделяне на променливи var1 и var2, резултатът, записан в променливата “result”, ще бъде в целочислен формат. Всеки път, когато това се случи, стойността, съхранена в променливата „резултат“, губи значението си, тъй като не отчита дробната част, която обикновено се получава при деленето на две числа.

За да принудим преобразуването на типа в такива ситуации, ние използваме изрично преобразуване на типа.

Изисква оператор за преобразуване на типове. Общият синтаксис за операциите за преобразуване на типове е както следва:

(type-name) expression

Тук

  • Името на типа е стандартният тип данни на езика C.
  • Изразът може да бъде константа, променлива или действителен израз.

Нека напишем програма, за да демонстрираме как да преобразуваме в C с изрично преобразуване на типове.

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

Изход:

Value of a is 1.200000
Value of b is 2

Изрично кастинг на типове

  1. Инициализирахме променлива 'a' от тип float.
  2. След това имаме друга променлива „b“ от целочислен тип данни. Тъй като променливите „a“ и „b“ са от различни типове данни, „C“ няма да позволи използването на такъв израз и това ще доведе до грешка. В някои версии на „C“ изразът ще бъде оценен, но резултатът няма да е желаният.
  3. За да избегнем подобни ситуации, ние преобразувахме променливата 'a' от тип float. Използвайки изрични методи за преобразуване на типа, ние успешно преобразувахме float в тип данни integer.
  4. Имаме отпечатана стойност на 'a', която все още е float
  5. След привеждане на типа резултатът винаги ще бъде цяло число 'b.'

По този начин можем да приложим изрично преобразуване на типове в C програмирането.

Въпроси и Отговори

Преобразуването на типове е автоматичната промяна от компилатора; преобразуването на типове е изричната промяна, която заявявате с оператор за преобразуване. Преобразуването е една от формите на преобразуване.

Може. Преобразуването от тип „float“ в „integer“ отрязва дробта, преобразуването от тип „double“ в „float“ закръглява цифрите, а преобразуването от тип „long“ в „integer“ пропуска битове от висок порядък. Разширяващите преобразувания остават безопасни.

Да. C ви позволява да преобразувате един тип указател към друг, а указателите към обекти се преобразуват в void* и обратно. Разреференцирането на несъвместимо преобразуван указател води до неопределено поведение.

C има само преобразуване на стойности (тип) в стил C. C++ добавя четири по-безопасни именувани преобразувания — static_cast, dynamic_cast, const_cast и reinterpret_cast — с по-ясно, проверено от компилатора намерение.

Стойността запазва само битовете си от по-нисък порядък. Ако е твърде голяма, резултатът се пренася или променя знака, така че първо проверете дали се вписва в целевия диапазон.

Предпочитайте разширяващи преобразувания, проверявайте дали стойността е подходяща преди стесняване и преобразувайте един операнд към число с плаваща запетая преди целочислено деление. Активирайте предупрежденията на компилатора, за да маркирате рискови преобразувания.

Да. Асистент с изкуствен интелект пише изрази за преобразуване от подкана, обяснява правилата за промоция и предупреждава кога преобразуването може да доведе до загуба на данни. Винаги компилирайте и тествайте резултата.

Копилот на GitHub предлага имплицитни и експлицитни изрази за преобразуване от коментар, включително синтаксиса (име-на-тип). RevПрегледайте всяко предложение за евентуална загуба на данни, преди да го компилирате.

Обобщете тази публикация с: