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

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерної техніки, автоматики та метрології
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2011
Тип роботи:
Звіт
Предмет:
Структури даних та алгоритми

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ Кафедра ЕОМ ЗВІТ ЛАБОРАТОРНОЇ РОБОТИ №2 З ПРЕДМЕТУ: «Програмування. Частина III. Структури даних та алгоритми» ТЕМА: «Перетворення типів даних» ВИБІР ВАРІАНТУ: Завдання 1  х0 wchar_t  х1 unsigned int  х2 char  х3 char  х4 unsigned long int  х5 signed long int  х6 unsigned short int  х7 long double  х8 signed int  х9 unsigned short int  х10 float  х11 unsigned long int  Завдання 2  const int x_4= 0x0717; int x=x_4;  const double y_4=-7.17e-1; double y=y_4;  v2 w0  v7 w3   Львів – 2011 Мета роботи. Дослідження методів та засобів явного та неявного перетворення типів даних. Постановка задачі. Завдання 1: Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено. wchar_t x0=0; unsigned int x1=17; char x2=2; char x3=3; unsigned long int x4=4; signed long int x5=5; unsigned short int x6=6; long double x7=7; signed int x8=8; unsigned short int x9=9; float x10=10; unsigned long int x11=11; /* 1 */ x1 = x1 – 0xFFFFFFFA; /* 2 */ x3 = ’a’ + x0 – x2; /* 3 */ x7 = x4 + x5 + x6 * 0.1; /* 4 */ x8 = x9 + x10 – x11*10; Завдання 2 Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат. const int x_4= 0x0717; const double y_4=-7.17e-1; int x=x_4; double y=y_4; char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2); char v7=*reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3); char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0); short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3); Алгоритм розв’язання задачі. За індивідуальним завданням я розробила алгоритм розв’язання задачі. Цей алгоритм був реалізований у програмі, в якій спочатку підключаються потрібні для виконання програми бібліотеки, а саме stdio.h, conio.h, iostream. Після цього ініціалізовані усі потрібні змінні. Для кожної змінної властивий інший тип, який обирається згідно індивідуального варіанту. Після цього виконуються операції над змінними та виведення значень: /* 1 */ x1 = x1 - 0xFFFFFFFA; /* 2 */ x3 = 'a' + x0 - x2; /* 3 */ x7 = x4 + x5 + x6 * 0.1; /* 4 */ x8 = x9 + x10 - x11*10; cout << "x1= " <<x1<< endl << "x3= " <<x3<< endl << "x7= " <<x7<< endl << "x8= " <<x8<< endl <<endl; Наступним у програмі є задання нових зміннихта виконання над ними дій, після чого задане виведення отриманих значень: int x=x_4; double y=y_4; char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2); char *v7=reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3); char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0); short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3); Система тестів Завдання 1. Розглянемо , як відбуваються перетворення в першому виразі: x1 = x1 – 0xFFFFFFFA unsigned int = unsigned int - int 0xFFFFFFFA ВПК: FA FF FF FF Літерал 0xFFFFFFFA приводиться до unsigned int. Метод: збереження бітів, старший біт втрачає функцію знакового біта. ВПК: FA FF FF FF FF FF FF FA = −6 10 unsigned int x1 = 17 10 ВПК: 11 00 00 00 Залишається unsigned int. x1 = 00 00 00 11 = 17 10 Результат: 17 – (-6) = 23 10 (unsigned int) ВПК: 17 00 00 00 Присвоюється без змін, бо обидва операнди типу unsigned int. ВПК: 17 00 00 00 x1 = 00 00 00 17 = 23 10 Втрати значимості даних не відбулося. Розглянемо , як відбуваються перетворення в другому виразі: x3 = ’a’ + x0 – x2; char = char + wchar_t – char ‘a’ ВПК: 61 Символьна константа 'a' приводиться до int Метод: доповнення знаком. ВПК: 61 00 00 00 00 00 00 61 = 97 10 wchar_t x0 = 0 ВПК: 00 00 Константа приводиться до int Метод: доповнення знаком. ВПК: 00 00 00 00 00 00 00 00 = 0 10 char x2 = 2 10 ВПК: 02 Константа приводиться до int Метод: доповнення знаком. ВПК: 02 00 00 00 00 00 00 02 = 2 10 Результат: 97 + 0 – 2 = 95 10 ВПК: 5F 00 00 00 (int) x3 = 00 00 00 5F = 95 10 =’_’ Втрати значимості даних не відбулося. Розглянемо , як відбуваються перетворення в третьому виразі: x7 = x4 + x5 + x6 * 0.1; long double = unsigned long int + signed long int + unsigned short int *double unsigned long int x4 = 4 ВПК: 04 00 00 00 2 Приводиться до int. Метод: доповнення нулями. ВПК: 04 00 00 00 З int в double. Метод: представляється як double, якщо не може бути представлене точно, то відбувається деяка втрата точності ВПК: 00 00 00 00 00 00 10 40 x4 = 40 10 00 00 00 00 00 00 = 4 10 signed short int x5= 5 10 ВПК: 05 00 Приводиться до int. Метод: розмноження знака. ВПК: 05 00 00 00 З int до double. Метод: представляється як double, якщо не може бути представлене точно, то відбувається деяка втрата точності ВПК: 00 00 00 00 00 00 14 40 x5 = 14 40 00 00 00 00 00 00 = 5 10 unsigned short int x6 = 6 10 ВПК: 06 00 Приводиться до int. Метод: доповнення нулями. ВПК: 06 00 00 00 З int до double. Метод: представляється як double, якщо не може бути представлене точно, то відбувається деяка втрата точності. ВПК: 00 00 00 00 00 00 18 40 x6= 40 18 00 00 00 00 00 00 = 6 10 0,1 ВПК: 9A 99 99 99 99 99 B9 3F Залишається double. 3F B9 99 99 99 99 99 9A = 0,1 10 Результат: 4 + 5 + 6*0,1 = 9,6 (double) ВПК: 66 66 66 66 66 66 1A 40 Приводиться до long double. Присвоюється без змін. ВПК: 33 33 33 33 33 33 23 40. x7 = 40 23 33 33 33 33 33 33 = 9,6 10 Втрати значимості даних не відбулося. Розглянемо , як відбуваються перетворення в четвертому виразі: x8 = x9 + x10 – x11*10; signed int = unsigned short int + float – unsigned long int*int unsigned short int x9 = 9 ВПК: 09 00 Приводиться до int. Метод: доповнення нулем. ВПК 09 00 00 00 З іnt перетворення у float. ВПК: 00 00 10 41 x9 = 10 41 00 00 = 9 10 float x10 = 10 ВПК: 00 00 20 41 Тип не зміниться. x10 = 41 20 00 00 = 10 10 unsigned int x11 = 11 ВПК: 0B 00 00 00 Приводиться до int (без змін). ВПК: 0B 00 00 00 З іnt перетворення у float. ВПК: 00 00 30 41 x11 = 41 30 00 00 = 11 10 10 (int) ВПК: 0A 00 00 00 З іnt перетворення у float. ВПК: 00 00 20 40 20 40 00 00 = 10 10 Результат: 9 + 10 – 11*10 = -91 (float) ВПК: 00 00 В6 С2 Приводиться до signed int. Метод: усікання дробової частини. ВПК: A5 FF FF FF x8 = FF FF FF A5 = 4294967205 10 Втрат значимості даних не відбулось. Завдання 2 char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2); char v7=*reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3); char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0); short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3); const int x_4= 0x0717; const double y_4=-7.17e-1; char v2=*reinterpret_cast<char*> (&x) +1; int x = 0x0717 ВПК: 17 07 00 00 Спочатку відбувається приведення x до char. Метод: збереження молодшого байта. ВПК: 17 1716=2310 v1 = 23 + 1 = 24 printf("%d %x %c \n", v1,v1,v1) 24 18 1) 24 – v1 в десятковій системі числення, як число; 2) 18 – v1 приведене до типу int методом доповнення знаку в 16 с. ч.; 3) – v1 інтерпретоване як unsigned char і представлене як символ з табл. ASCII. char v7=*reinterpret_cast<char*> (&x); int x = 0x0717 ВПК: 17 07 00 00 Спочатку відбувається приведення x до char. Метод: збереження молодшого байта. ВПК: 17 1716=2310 v7=23. Так як printf("%d %x %c \n", *v7+1,*v7+2, *v7+3); Тоді беремо значення, яке знаходиться у пам’яті за адресою v7: 2310+110=2410 – v7 в десятковій системі числення, як число; 1716+216=1916 – v7 в шістнадцятковій системі числення; 23+3=26 відповідно береться символ під номером 26 з таблиці ASCII. char w0 =*(reinterpret_cast<char*>(&y)+2)+12; double y=-7.17e-1 ВПК: 8B 6C E7 FB A9 F1 E6 BF Спочатку відбувається приведення у до char. З пам’яті береться один молодший байт числа , але оскільки є оператор «+2», то береться 2-ий байт після молодшого. ВПК: Е7 Е716=>23110 23110+1210=24310 Е716=>1110 01112 1110 0111 0001 1000 + 1 ________ 0001 10012=>-1916=>-2510 -2510+1210=-1310 w0=-13 FF FF FF F3 – w0 у 16-ій системі числення; 42 94 96 72 83 – w0 задане типом unsigned double; -13 – w0 у десятковій системі числення. short w3=*reinterpret_cast<short*>(&y) + 1; double y=-7.17e-1 ВПК: 8В 6С Е7 FB A9 F1 E6 BF Спочатку відбувається приведення у до short, так як цей тип має 2 байти. ВПК: 6С 8В 6С 8В16=>2778710 Виконуємо додавання 1, щоб отримати кінцевий результат: 2778710+110=2778810 w3=2778810 2778810=>6C 8C16 6C 8C – w3 представлене у 16-ій системі числення; 27788 – w3 задане типом unsigned double; 27788 – w3 у десятковій системі числення. Результати виконання програми. / Висновки. Виконавши дану лабораторну роботу, я дослідила методи та засоби явного та неявного перетворення типів даних. Додатки. //--------------------------------------------------------------------------- #include<stdio.h> #include<conio.h> #include <iostream> //--------------------------------------------------------------------------- int main (void) { wchar_t x0=0; unsigned int x1=17; char x2=2; char x3=3; unsigned long int x4=4; signed long int x5=5; unsigned short int x6=6; long double x7=7; signed int x8=8; unsigned short int x9=9; float x10=10; unsigned long int x11=11; /* 1 */ x1 = x1 - 0xFFFFFFFA; /* 2 */ x3 = 'a' + x0 - x2; /* 3 */ x7 = x4 + x5 + x6 * 0.1; /* 4 */ x8 = x9 + x10 - x11*10; cout << "x1= " <<x1<< endl << "x3= " <<x3<< endl << "x7= " <<x7<< endl << "x8= " <<x8<< endl <<endl; const int x_0=11900; const int x_1= 017070; const int x_2= 0x1707; const int x_3= 007170; const int x_4= 0x0717; const double y_0=1.19; const double y_1=-17.7; const double y_2=7.17e+2; const double y_3=-17.7e1; const double y_4=-7.17e-1; int x=x_4; double y=y_4; char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2); char *v7=reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3); char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0); short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3); getch(); return 0; } //---------------------------------------------------------------------------
Антиботан аватар за замовчуванням

21.10.2013 21:10-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!