МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт з
лабораторної роботи № 2
з дисципліни:
" Програмування. Частина III.
Структури даних та алгоритми "
"Перетворення типів даних"
1. МЕТА РОБОТИ
Дослідження методів та засобів явного та неявного перетворення типів даних.
2.ПОСТАНОВКА ЗАДАЧІ
Завдання 1:
Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено.
char x0=0;
unsigned int x1=6;
signed short int x2=2;
signed short int x3=3;
signed short int x4=4;
char x5=5;
unsigned int x6=6;
float x7=7;
char x8=8;
signed short int x9=9;
long double x10=10;
unsigned int x11=11;
x1=x1-0xFFFFFFFA;
x3='a'+x0-x2;
x7=x4+x5+x6*0.1;
x8=x9+x10-x11*10;
Завдання 2
Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат
char v1= static_cast< char > (x)+11);
char v5=*reinterpret_cast<char*> (&x) +2;
char w0=*(reinterpret_cast<char*>(&y)+2)+12;
short w3=*reinterpret_cast<short*>(&y) + 1;
3.АЛГОРИТМ РОЗВ’ЯЗАННЯ ЗАДАЧІ
Підключаємо бібліотеки iostream і conio для виводу на консоль і для затримки результату.
Створюємо змінні різних типів і присвоюємо їм значення відповідні до варіанту. Робимо дії і присвоюємо змінним x1,x3,x7,x8 і прослідковуємо перетворення типів. Створюємо другі дві змінні x i y. Задопомогою «reinterpret_cast» змінну певно типу присвоюємо змінній іншого типу, і виводимо на консоль в шістнадцятковій десятковій формі і їхнє ANCI значення. Задопомогою функції getch() затримуємо результат на екрані.
4.СИСТЕМА ТЕСТІВ
Завдання 1
x1 = x1 – 0xFFFFFFFA
unsigned int x1 = 6
ВПК: 06 00 00 00
0xFFFFFFFA
ВПК: FAFFFFFF
FF FF FF FA16= -610
unsigned int x1 = x1+ (–0xFFFFFFFA)= 6+6=12
Результат: 12
x3 = ’a’ + x0 – x2
signed short int х2 =2
ВПК: 02 00
Символьна константа 'a' - значення 9710=6116 за таблицею ASCII
char −> signed short int
ВПК: 61 −> 61 00
char х0=0
char−> signed short int
ВПК: 00 −> 00 00
signed short int x3=’a’+x0-x2=97+0-2=95
Результат: 95
3. x7 = x4 + x5 + x6 * 0.1
1) 0.1 – типу float
ВПК: cd cc cc 3d (переведено за допомогою програми з лаб1)
signed short int x4=4
signed short int −> int;
ВПК: 04 00 −> 04 00 00 00
int −> float
ВПК: 04 00 00 00 −> 00 00 80 40 (переведено за допомогою програми з лаб1)
char x5=5
а) char −> int
ВПК: 05 −> 05 00 00 00
б) int −> double
ВПК: 05 00 00 00 −> 00 00 a0 40 (переведено за допомогою програми з лаб1)
4) unsigned int x6=6
unsigned int −> int
ВПК: 06 00 00 00 −> 06 00 00 00
int −> float
ВПК: 06 00 00 00 −> 00 00 c0 40 (переведено за допомогою програми з лаб1)
float x7 = x4 + x5 + x6 * 0.1=4+5+6*0.1=9.6
Результат: 9.6
4. x8 = x9 + x10 – x11*10
1) unsigned int x11=11
ВПК: 0B 00 00 00
2) х9=9
a)signed short int −> int;
ВПК:09 00 −> 09 00 00 00
b)int−>double;
ВПК:09 00 00 00 −> 00 00 00 00 00 00 22 40
c)double−>long;
ВПК: 09 00 00 00 00 00 00 00
3) long double х10=10;
ВПК: 0A 00 00 00 00 00 00 00
Результат:
char x8 = x9 + x10 – x11*10
x11*10
11*10=11010=6E16
0110 1110 000…. −> Оскільки знак відємний інвертуємо і додаємо 1−>
1001 001000000…2 −> 92 00 00 00 00 00 00 0016 −> 14610
146+19=165;
16510=A516 – в ASCII коді це є “е”
Результат: е
4.1 Представлення змінної v1
char v1= static_cast< char > (x)+11);
printf("%d %x %c \n", v1,v1,v1);
x = 06 0516
ВПК: 05 06
Char однобайтний тип, беремо 1 байт – 05=0000 0101;
v=1;
v1+11 =16; - %d –в десятковій формі
v1+11 = 16; - %x – в шістнадцятко вій формі, 1610=1016
v1+11 = 16; - %с – в таблиці ASCII №6 це символ ◙
Відповідь: 16 10 ◙
4.2 Представлення змінної v5
char v5=*reinterpret_cast<char*> (&x) +2;
printf("%d %x %c \n", v5,v5,v5);
int x=0x0605
x = 06 0516
ВПК: 05 06
Char однобайтний тип, беремо 1 байт + 2 −> 0716=0000 01112
710=716;
В ASCII таблиці під №710 знаходиться символ •
Відповідь:7 •
4.3 Представлення змінної w0
char w0=*(reinterpret_cast<char*>(&y)+2)+12;
printf("%x %lu %ld \n", w0,w0,w0);
double y= 0.3;
ВПК:00 00 00 00 00 45 D2 A0 (переведено задопомоги програми з лаб1)
Char тип який має 1 байта, перемо перший байт– він рівний 0;
0+2+12=1410=E16
Відповідь: E 14 14
4.4 Представлення змінної w3
short w3=*reinterpret_cast<short*>(&y) + 3;
printf("%x %u %d \n", w3,w3,w3);
double y= -6.5e1= - 65;
ВПК: 00 00 00 00 00 12 A2 9E (переведено задопомоги програми з лаб1)
(&y)+3) означає що беремо останні 2 байта – A2 9E
ВПК: 9E A2 16 = 1001 1110 1010 00102 оскільки перша цифра 1 то число відємне, інвертуємо і додаємо 1, отримуємо 0110 0001 0101 11102= -2492610
-2492610=-615E16
Відповідь: -615E 4291006 -24926
5.Результати програми
/
ВИСНОВКИ
Я навчився досліджувати методи явного і неявного перетворення типів даних;
ДОДАТОК
Лістинг програми
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
char x0=0;
unsigned int x1=6;
signed short int x2=2;
signed short int x3=3;
signed short int x4=4;
char x5=5;
unsigned int x6=6;
float x7=7;
char x8=8;
signed short int x9=9;
long double x10=10;
unsigned int x11=11;
x1=x1-0xFFFFFFFA;
x3='a'+x0-x2;
x7=x4+x5+x6*0.1;
x8=x9+x10-x11*10;
cout<<x1<<endl<<x3<<endl<<x7<<endl<<x8<<endl<<"************"<<endl;
//int x_2; double y_1;
int x=0x0605;
double y=-6.5e1;
char v1= static_cast< char > (x)+11);
printf("%d %x %c \n", v1,v1,v1);
char v5=*reinterpret_cast<char*> (&x) +2;
printf("%d %x %c \n", v5,v5,v5);
char w0=*(reinterpret_cast<char*>(&y)+2)+12;
printf("%x %lu %ld \n", w0,w0,w0);
short w3=*reinterpret_cast<short*>(&y) + 3;
printf("%x %u %d \n", w3,w3,w3);
getch();
return 0;
}