Приведення типів у C: неявне та явне перетворення

⚡ Розумний підсумок

Приведення типів у C перетворює один тип даних на інший, або неявно, коли компілятор автоматично переводить на менший сумісний тип, або явно, коли програміст примусово виконує перетворення за допомогою оператора приведення, щоб контролювати точність та запобігати неочікуваним результатам.

  • 🔄 Дві форми: Неявне приведення типів виконується автоматично; явне приведення типів записується за допомогою оператора приведення.
  • ⬆️ Тип рекламної акції: Перетворення меншого типу на більший сумісний, наприклад, short на int, зберігає значення.
  • ✂️ Ризик втрати даних: Звуження приведень типів, таких як float до int, призводить до пропускання дробу та втрати сенсу.
  • 🎯 Явний синтаксис: Запис виразу (назва типу) примушує до перетворення, такого як приведення цілочисельних операндів до чисел з плаваючою комою.
  • 🤖 Допомога AI: Помічники ШІ та GitHub Copilot створюють чернетки виразів для приведення типів та позначають ризиковані звужуючі конверсії.

Приведення типів у C

Що таке приведення типів у C?

Приведення типів — це перетворення одного типу даних в інший. Це також називається перетворенням даних або перетворенням типів мовою 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, яка має тип даних short, копіюється в змінну 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 з явним приведенням типів.

#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', яке все ще є числом з плаваючою точкою
  5. Після приведення типів результатом завжди буде ціле число «b».

Таким чином ми можемо реалізувати явне приведення типів у програмуванні на C.

Поширені запитання

Перетворення типів — це автоматична зміна компілятором; приведення типів — це явна зміна, яку ви запитуєте за допомогою оператора приведення типів. Приведення типів — це одна з форм перетворення.

Це можливо. Перетворення типу float на цілий обрізає дріб, типу double на цілий обрізає цифри, а типу long на цілий відкидає старші біти. Розширювальні приведення типів залишаються безпечними.

Так. C дозволяє перетворювати типи вказівників з одного типу на інший, а вказівники на об'єкти перетворюються на типи void* і назад. Розіменування несумісного перетворення вказівника призводить до невизначеної поведінки.

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

Значення зберігає лише молодші біти. Якщо воно занадто велике, результат переноситься на іншу величину або змінює знак, тому спочатку перевірте, чи воно відповідає цільовому діапазону.

Надавати перевагу розширювальним перетворенням, перевіряти відповідність значення перед звуженням та перетворювати один операнд на число з плаваючою комою перед цілочисельним діленням. Увімкнути попередження компілятора для позначення ризикованих перетворень.

Так. Помічник штучного інтелекту записує вирази приведення типів з підказки, пояснює правила просування та попереджає, коли перетворення може призвести до втрати даних. Завжди компілюйте та тестуйте результат.

Копілот GitHub пропонує неявні та явні вирази приведення типів з коментаря, включаючи синтаксис (ім'я-типу). RevПерегляньте кожну пропозицію щодо можливої ​​втрати даних перед компіляцією.

Підсумуйте цей пост за допомогою: