МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт з
лабораторної роботи № 2
з дисципліни:
" Програмування. Частина III.
Структури даних та алгоритми "
"Перетворення типів даних"
1. МЕТА РОБОТИ
Дослідження методів та засобів явного та неявного перетворення типів даних.
2.ПОСТАНОВКА ЗАДАЧІ
Завдання 1:
Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено.
char x0=0;
unsigned int x1=7;
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 *v7=reinterpret_cast<char*>(&x);
char v3=*(reinterpret_cast<char*>(&x)+1)+11;
long w1 =*reinterpret_cast<long*>(&y)+33;
short w6=*(reinterpret_cast<short*>(&y)+3)+13;
3.АЛГОРИТМ РОЗВ’ЯЗАННЯ ЗАДАЧІ
Підключаємо бібліотеки iostream і conio для виводу на консоль і для затримки результату.
Створюємо змінні різних типів і присвоюємо їм значення відповідні до варіанту. Робимо дії і присвоюємо змінним x1,x3,x7,x8 і прослідковуємо перетворення типів. Створюємо другі дві змінні x i y. Задопомогою «reinterpret_cast» змінну певно типу присвоюємо змінній іншого типу, і виводимо на консоль в шістнадцятковій десятковій формі і їхнє ANCI значення. Задопомогою функції getch() затримуємо результат на екрані.
4.СИСТЕМА ТЕСТІВ
Завдання 1
x1 = x1 – 0xFFFFFFFA
unsigned int x1 = 26
ВПК: 26 00 00 00
0xFFFFFFFA
ВПК: FAFFFFFF
FF FF FF FA16= -610
unsigned int x1 = x1+ (–0xFFFFFFFA)= 26+6=32
Результат: 32
x3 = ’a’ + x0 – x2
Unsigned long int х2 =2
ВПК: 02 00
Символьна константа 'a' - значення 9710=6116 за таблицею ASCII
char −> int
int-> unsigned long int
ВПК: 61 −> 61 00
wchar_t х0=0
wchar_t −> unsigned long int
ВПК: 00 −> 00 00
unsigned long 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)
char x4=4
double −> int;
ВПК: 04 00 −> 04 00 00 00
int −> double
ВПК: 04 00 00 00 −> 00 00 80 40 (переведено за допомогою програми з лаб1)
unsigned long int x5=5
а) unsigned long int −> 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 Представлення змінної v7
char *v7=reinterpret_cast<char*>(&x);
printf ("%d %x %c \n", *v7+1,*v7+2,*v7+3);
int x=0x0703
x = 07 0316
ВПК: 03 07
Char однобайтний тип, беремо 1 байт – 03=0000 0011;
*v=3;
*v7+1 =4; - %d –в десятковій формі
*v7+2 = 5; - %x – в шістнадцятко вій формі, 510=516
*v7+3 = 6; - %с – в таблиці ASCII №6 це символ ♠
Відповідь: 4 5 ♠
4.2 Представлення змінної v3
char v3=*(reinterpret_cast<char*>(&x)+1)+11;
printf("%d %x %c \n", v3,v3,v3);
int x=0x0703
x = 07 0316
ВПК: 03 07
Char однобайтний тип, беремо 1 байт + 1 −> 0716=0000 01112
7+11=1810=1216;
В ASCII таблиці під №1810 знаходиться символ ↕
Відповідь:18 12 ↕
4.3 Представлення змінної w1
long w1 =*reinterpret_cast<long*>(&y)+33;
printf("%lx %lu %ld \n", w1,w1,w1);
double y= -7.3e1= -73;
ВПК:00 00 00 00 00 40 52 C0 (переведено задопомоги програми з лаб1)
Long тип який має 4 байта, перемо перших 4 байта – вони рівні 0;
0+33=3310=2116
Відповідь: 21 33 33
4.4 Представлення змінної w6
short w6=*(reinterpret_cast<short*>(&y)+3)+13;
printf("%x %u %d \n", w6,w6,w6);
double y= -73;
ВПК: 00 00 00 00 00 40 52 C0 (переведено задопомоги програми з лаб1)
(&y)+3) означає що беремо останні 2 байта – 52 С0
ВПК: С0 52 16 = 1100 0000 0101 00102 оскільки перша цифра 1 то число відємне, інвертуємо і додаємо 1, отримуємо 0011 1111 1010 11102= -1630210
-16302+13= -1628910= FFFFC05F16
4 294 967 295 – 16289=4294951006
Відповідь : FFFFC05F 4294951006 -16302
5.Результати програми
/
ВИСНОВКИ
Я навчився досліджувати методи явного і неявного перетворення типів даних;
ДОДАТОК
Лістинг програми
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
char x0=0;
unsigned int x1=7;
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=0x0703;
double y=-7.3e1;
char *v7=reinterpret_cast<char*>(&x);
printf ("%d %x %c \n", *v7+1,*v7+2,*v7+3);
char v3=*(reinterpret_cast<char*>(&x)+1)+11;
printf("%d %x %c \n", v3,v3,v3);
long w1 =*reinterpret_cast<long*>(&y)+33;
printf("%lx %lu %ld \n", w1,w1,w1);
short w6=*(reinterpret_cast<short*>(&y)+3)+13;
printf("%x %u %d \n", w6,w6,w6);
getch();
return 0;
}