МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИНАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ
Кафедра ЕОМ
ЗВІТ ЛАБОРАТОРНОЇ РОБОТИ №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;
}
//---------------------------------------------------------------------------