Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_rob_7.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
455.68 Кб
Скачать

Int main()

{

printf("CHAR_MIN=\t%d\n",CHAR_MIN);

printf("CHAR_MAX=\t%d\n",CHAR_MAX);

printf("INT_MAX=\t%d\n",INT_MAX);

printf("INT_MIN=\t%d\n",INT_MIN);

printf("LONG_MAX=\t%ld\n",LONG_MAX);

printf("FLT_MAX=\t%e\n",FLT_MAX);

printf("DBL_MIN=\t%e\n",DBL_MIN);

return 0;

}

Для використання завдання 6 можна також використовувати бібліотеки limits.h і float.h. Наприклад, аналіз можливості зміни нижньої та верхньої межі кожного типу виконуємо за допомогою функції increment і decrement:

char ch=127;

printf("max char ch=\t\t\t%d\n",ch);

ch++;

printf("after ch++ min ch=\t\t%d\n",ch);

unsigned char unch=255;

printf("max unsigned char unch=\t\t%d\n",unch);

unch++;

printf("after unch++ min unch=\t\t%d\n",unch);

Правила перетворення типів

При обчисленні виразів деякі операції вимагають, щоб операнди мали відповідний тип, а якщо вимоги до типу не виконані, примусово викликають виконання потрібних перетворень. Та ж ситуація виникає при ініціалізації, коли тип виразу, що ініціалізується, приводиться до типу обумовленого об'єкта. Нагадаємо, що в мові Сі присвоювання є бінарною операцією, тому сказане щодо перетворення типів стосується й до всіх форм присвоювання, однак при присвоюваннях значення виразу із правої частини завжди приводиться до типу змінної з лівої частини, незалежно від співвідношення цих типів.

Правила перетворення в мові Сі для основних типів визначені стандартом мови. Ці стандартні перетворення включають переклад "нижчих" типів в "вищі".

Серед перетворень типів виділяють:

  • перетворення в арифметичних виразах;

  • перетворення при присвоюваннях;

  • перетворення вказівників.

При перетворенні типів потрібно розрізняти перетворення, що змінюють внутрішнє подання даних, і перетворення, що змінюють тільки інтерпретацію внутрішнього подання. Наприклад, коли дані типу unsigned int переводяться в тип int, міняти їхнє внутрішнє подання не потрібно - змінюється тільки інтерпретація. При перетворенні значень типу float у значення типу int недостатньо змінити тільки інтерпретацію, необхідно змінити довжину ділянки пам'яті для внутрішнього подання й кодування. При такому перетворенні з float в int можливий вихід за діапазон припустимих значень типу int, і реакція на цю ситуацію істотно залежить від конкретної реалізації. Саме тому для збереження мобільності програм у них рекомендується з обережністю застосовувати перетворення типів.

Розглянемо послідовність виконання перетворення операндів в арифметичних виразах.

  1. Всі короткі цілі типи перетворяться в типи не меншої довжини відповідно до табл. 2.4. Потім обидва значення, що беруть участь в операції, приймають однаковий тип у відповідності з наступними правилами.

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

  3. Якщо п. 2 не виконується й один з операндів є double, іншої приводиться до типу double.

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

  5. Якщо п. 2 - 4 не виконуються (обоє операнда цілі) і один операнд unsigned long int, то обоє операнда перетворяться до типу unsigned long int.

  6. Якщо п. 2 - 5 не виконуються й один операнд є long, іншої перетвориться до типу long.

  7. Якщо п. 2 - 6 не виконуються й один операнд unsigned, то іншої перетвориться до типу unsigned.

  8. Якщо п. 2 - 7 не виконані, то обидва операнда належать типу int.

Використовуючи арифметичні вирази, варто враховувати наведені правила й не потрапляти в "пастки" перетворення типів, тому що деякі з них приводять до втрат інформації, а інші змінюють інтерпретацію бітового (внутрішнього) подання даних.

На рисунку 7.1 стрілками відзначені "безпечні" арифметичні перетворення, що гарантують збереження точності й незмінність чисельного значення.

Таблиця 7.3 Правила стандартних арифметичних перетворень

Вихідний тип

Перетворений тип

Правила перетворень

char

int

Розширення нулем або знаком залежно від умовчання для char

unsigned char

int

Старший байт заповнюється нулем

signed char

int

Розширення знаком

short

int

Зберігається те ж значення

unsigned short

unsigned int

Зберігається те ж значення

enum

int

Зберігається те ж значення

бітове поле

int

Зберігається те ж значення

Рисунок 7.1 – Арифметичні перетворення типів, що гарантують збереження значимості

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

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

Розглянемо фракмент програми для визначення правил перетворення типів.

char ch=100;

short int shi=3200;

printf("ch=\t%с\n", ch);

printf("(short int)ch=\t%d\n", (short int) ch); // виведення символьної

//змінної в форматі типу short int

printf("shi=\t%d\n", shi);

printf("error (char)shi=\t%d\n", (char) shi); // виведення змінної shi

// в форматі типу char

Зверніть увагу, що в другому випатку перетворення типів відбулась страта інформації через те, що тип char має менший діапазон ніж тип short int.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]