Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
/
Звіт
про виконання лабораторної роботи №3
з дисципліни:
“Програмування, частина 3 (Структури даних та алгоритми)”
на тему:“ Перетворення типів даних ”
Львів
2017
Мета: дослідження методів та засобів явного та неявного перетворення типів даних.
Постановка задачі
День народження студента = 07
Місяць народження студента = 08
Завдання №1
Оголошені наступні змінні:
char x0 = 0;
unsigned int x1 = 7;
signed short int x2 = 2;
long double x3 = 3;
signed short int x4 = 4;
unsigned short int x5 = 5;
unsigned int x6 = 6;
unsigned int x7 = 7;
long double x8 = 8;
unsigned int x9 = 9;
unsigned int x10 = 10;
unsigned short int x11 = 11;
Потрібно визначити, які неявні перетворення будуть відбуватися при обчисленні таких виразів:
x1 = x1 – 0xFFFFFFFA;
x3 = ’a’ + x0 – x2;
x7 = x4 + x5 + x6 * 0.1;
x8 = x9 + x10 – x11*10;
Завдання №2
Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат.
int x = 2; //замість № підставити значення: DN % 5
float y = 1; // замість № підставити значення: DN % 3
char v4 = static_cast< char > (x) + 22;
printf("%d %x %c \n", v4, v4, v4);
short w6 = *(reinterpret_cast<short*>(&y) + 3) + 13;
printf("%x %u %d \n", w6, w6, w6);
char v0 = *reinterpret_cast<char*> (&x) + 3;
printf("%d %x %c \n", v0 , v0, v0);
short w3 = *reinterpret_cast<short*>(&y) + 1;
printf("%x %u %d \n", w3, w3, w3);
Система тестів
Завдання 1
1. x1 = x1 – 0xFFFFFFFA;
1)”-“ unsigned int x1 -> signed int(0xFFFFFFFA)
2)”=” signed int -> unsigned int x1;
Результат unsigned int, точність втрачається.
2) x3 = ’a’ + x0 – x2;
’a’ + x0 – відбулось не явне переведення char до типу signed int, дані не втратились.
’a’ + x0 – x2 – відбулось не явне переведення signed short int (х2) до типу signed int. Дані не втратились.
x3 = ’a’ + x0 – x2; - відбулось не явне переведення signed int до типу double. Дані не втратились.
3) x7 = x4 + x5 + x6 * 0.1;
x6 * 0.1 – відбулось не явне переведення unsigned int до типу signet int. Дані не втратились.
x4 + x5 – відбулось не явне переведення signed short int до типу unsigned short int. Дані не втратились.
x4 + x5 + x6 * 0.1 - відбулось не явне переведення unsigned short int до типу signet int. Дані не втратились.
x7 = x4 + x5 + x6 * 0.1; - відбулось не явне переведення signet int до типу unsignet int. Дані не втратились.
4) x8 = x9 + x10 – x11*10;
x11*10 – відбулось не явне переведення типів, загальний тип unsigned short int став signed int. Дані не втратились.
x9 + x10 – переведення типів не відбулось, тому що х9 та х10 типу unsigned int. Дані не втратились.
x9 + x10 – x11*10 – відбулось не явне переведення типe unsigned int до типу signed int. Дані не втратились.
x8 = x9 + x10 – x11*10 – відбулось не явне перетворення signed int до long double. Дані не втратилися.
/
Рис.1 Результат виконання 1 завдання
Завдання 2
1)
static_cast< char > (x) – явне переведення типу int до типу char.
static_cast< char > (x)+22 – не явне переведення типу char до типу int.
char v4 = static_cast< char > (x)+22 - не явне переведення типу int до типу char.
printf("%d %x %c \n", v4,v4,v4) – далі не явно переводимо перші два типи завдяки модифікаторам і виводимо змінні на екран.
1 модифікатор d – int,( відбулось переведення типу char до типу int )
2 модифікатор х – int(16) ,( відбулось переведення типу char до типу int(16) )
3 модифікатор с – тип char(не відбулось переведення типів).
2)
*(reinterpret_cast<short*>(&y) - відбулось явне переведення вказівника типу double до вказівника типу short. Дані могли втратитись.
*(reinterpret_cast<short*>(&y)+3); - зміщення вказівника на 8 байти.
*(reinterpret_cast<short*>(&y)+3)+13- розіменування вказівника типу short, відбулось не явне переведення типу short до типу int. Дані не втратились.
short w6=*(reinterpret_cast<short*>(&y)+3)+13; - відбулось не явне переведення типу int до типу short. Дані могли втратитись.
printf("%x %u %d \n", w6,w6,w6); - далі завдяки модифікаторам і виводимо змінні на екран.
1 модифікатор x – int(16), (не відбулось перведення типів)
2 модифікатор u – unsigned int (відбулось переведення типу int до unsigned int )
3 модифікатор d – int . (не відбулось переведення типів).
3)
char v0 = *reinterpret_cast<char*> (&x) + 3
printf("%d %x %c \n", v0 , v0, v0);
reinterpret_cast<char*> (&x) – відбулося явне переведення вказівника типу int до вказівника типу char. Дані не втратились.
char v0 = reinterpret_cast<char*> (&x); - переведення типів не відбувається тому, що перед дорівнює вказівник на тип char і після дорівнює вказівник на тип char.
1 модифікатор d – 1) розадресування вказівника.
2) неявне переведення до типу int.
3) виведення в на екран переведення не відбулось.
2 модифікатор x - 1) розадресування вказівника.
2) неявне переведення до типу int (16).
3) виведення в на екран переведення не відбулось.
3 модифікатор c - 1) розадресування вказівника .
2) неявне переведення до типу int .
3) неявне переведення до типу char.
4)
*(reinterpret_cast<short*>(&y) - відбулось явне переведення вказівника типу double до вказівника типу short. Дані могли втратитись.
*reinterpret_cast<short*>(&y)+1; - зміщення вказівника на 4 байти.
*reinterpret_cast<short*>(&y)+1- розіменування вказівника типу short, відбулось не явне переведення типу short до типу int. Дані не втратились.
short w3=*reinterpret_cast<short*>(&y)+1; - відбулось не явне переведення типу int до типу short. Дані могли втратитись.
printf("%x %u %d \n", w3,w3,w3); - далі завдяки модифікаторам і виводимо змінні на екран.
1 модифікатор x – int(16), (не відбулось перведення типів)
2 модифікатор u – unsigned int (відбулось переведення типу int до unsigned int )
3 модифікатор d – int . (не відбулось переведення типів).
/
Рис.2 Результат виконання 2 завдання
Спеціфікація програми
int main() {
x1 = x1 - 0xFFFFFFFA;
x3 = 'a' + x0 - x2;
x7 = x4 + x5 + x6 * 0.1;
x8 = x9 + x10 - x11 * 10;
showInMemory(x1);
showInMemory(x3);
showInMemory(x7);
showInMemory(x8);
char v4 = static_cast< char > (x) + 22;
printf("%d %x %c \n", v4, v4, v4);
hort w6 = *(reinterpret_cast<short*>(&y) + 3) + 13;
printf("%x %u %d \n", w6, w6, w6);
char v0 = *reinterpret_cast<char*> (&x) + 3;
printf("%d %x %c \n", v0 , v0, v0);
short w3 = *reinterpret_cast<short*>(&y) + 1;
printf("%x %u %d \n", w3, w3, w3);
return 0;
}
Висновок: на даній лабораторній роботі я виконав дослідження методів та засобів явного та неявного перетворення типів даних.