DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

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

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Звіт лабораторної роботи №2 з предмету: «Програмування. Частина III. Структури даних та алгоритми» - Перетворення типів даних

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

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

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

Рік:
2011
Тип роботи:
Звіт
Предмет:
Програмування Ч 3 Структури даних і алгоритми
Група:
КН-1
Коротко про документ

Про що ця робота

У звіті досліджено методи та засоби явного й неявного перетворення типів даних у мові програмування C++. Наведено виконання індивідуального завдання з аналізом бітового представлення та результатів обчислень.

У роботі розглядаються

  • Перетворення типів даних
  • Явне перетворення типів
  • Неявне перетворення типів
  • Бітове представлення даних
  • Мова програмування C++
  • Внутрішнє представлення чисел
  • Арифметичні операції

Зміст і розділи

  1. Мета роботи
  2. Постановка задачі
  3. Алгоритм розв’язання задачі
  4. Система тестів
  5. Результати виконання програми
  6. Висновки
  7. Додатки
Для кого:Студенти технічних спеціальностей, які вивчають програмування та структури даних.
Викладачі:Викладач кафедри ЕОМ

Ключові поняття

перетворення типівreinterpret_castunsigned intlong doublewchar_tзнакова міткатаблиця ASCIIвтрата точностіпам'ятьбайт

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ Кафедра ЕОМ ЗВІТ ЛАБОРАТОРНОЇ РОБОТИ №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; } //---------------------------------------------------------------------------
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

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

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

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

Admin

26.02.2023 12:38

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