C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C перетворення типів


Якщо в арифметичних операціях беруть участь значення різних типів, то компілятор неявно намагається привести їх до одного типу. Крім того, коли ми присвоюємо змінній якесь значення, це значення завжди приводиться до типу змінної. наприклад:

char c = 6;
int d = c;

Змінній d , яка представляє тип int , присвоюється значення типу char , тому компілятор виконує перетворення значення від типу char до типу int .

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

Розглянемо, які перетворення застосовує компілятор при арифметичних операціях:

  1. Якщо один з операндів має тип long double , то другий операнд теж буде перетворений в тип long double

  2. Якщо попередній пункт не виконується і якщо один з операндів має тип double , то другий операнд теж буде перетворений до типу double

  3. Якщо попередній пункт не виконується і якщо один з операндів має тип float , то другий операнд теж буде перетворений до типу float

  4. Якщо попередній пункт не виконується і якщо один з операндів має тип unsigned long int , то другий операнд теж буде перетворений до типу unsigned long int

  5. Якщо попередній пункт не виконується і якщо один з операндів має тип long , то другий операнд теж буде перетворений до типу long

  6. Якщо попередній пункт не виконується і якщо один з операндів має тип unsigned , то другий операнд теж буде перетворений до типу unsigned

  7. Якщо попередній пункт не виконується то обидва операнда приводяться до типу int

наприклад:

int a = 10;
double b = 4;
double c = a + b;   // 14.000000

У виразі a + b число b представляє тип double , тому число a буде автоматично перетворюватиметься до числа double . І результат операції додавання також представлятиме тип double .


операція перетворення

За допомогою спеціальної операції перетворення ми можемо явно привести дані до потрібного типу. наприклад:

int a = 10;
int b = 4;
int c = a / b;                      // 2
double d = a / b;                   // 2.00000
double e = (double)a / (double)b;   // 2.50000
printf("c = %d \n", c);
printf("d = %f \n", d);
printf("e = %f \n", e);

У виразі int c = a / b; результат ділення буде цілочисельний - 2, при якому дробова частина буде відкинута, так як обидва операнда операції представляють цілі числа.

У виразі double d = a / b; результат ділення представлятиме дійсне число - 2.00000, але так як обидва операнда є цілими числами, то знову ж таки результат операції буде представляти ціле число 2, і тільки в полі виконання ділення відбудеться присвоєння результату змінної d з приведенням значення 2 від типу int до типу double.

У виразі double e = (double)a / (double)b застосовується явне перетворення даних до типу double, тому і результат ділення представлятиме дійсне число - 2.50000.

Для виконання операції приведення в дужках вказується той тип, до якого треба привести значення:

int number = 70;
char symbol = (char) number;
printf("symbol = %c \n", symbol);               //  F
printf("symbol (int code) = %d \n", symbol);    // 70

У ряді випадків перетворення супроводжуються втратою інформації. Без втрати інформації проходять такі ланцюжки перетворень:

char -> short -> int -> long

unsigned char -> unsigned short -> unsigned int -> unsigned long

float -> double -> long double

При всіх інших перетвореннях, які не входять до цих ланцюжків, ми можемо зіткнутися з втратою точності даних. Так, в прикладі вище перетворення від int до char не є безпечним, тому до таких перетворень слід ставитися з обережністю.


Наш партнер:
beta test mp3 playlist downloader