МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт з
лабораторної роботи № 2
з дисципліни:
" Програмування. Частина III.
Структури даних та алгоритми "
"Перетворення типів даних"
1. МЕТА РОБОТИ
Дослідження методів та засобів явного та неявного перетворення типів даних.
2.ПОСТАНОВКА ЗАДАЧІ
Завдання 1:
Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено.
wchar_t x0=0;
unsigned int x1=26;
unsigned long int x2=2;
long double x3=3;
char x4=4;
unsigned long int x5=5;
unsigned long int x6=6;
double x7=7;
unsigned int x8=8;
signed long int x9=9;
bool x10=10;
unsigned long int x11=11;
x1=x1-0xFFFFFFFA;
x3='a'+x0-x2;
x7=x4+x5+x6*0.1;
x8=x9+x10-x11*10;
Завдання 2
Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат
Char v3=*(reinterpret_cast<char*> (&x)+1)+11;
char *v7=reinterpret_cast<char*> (&x);
short w5=*(reinterpret_cast<short*>(&y)+2)+12;short long w2=static_cast<long>(y)+55;
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 x2=2;
ВПК: 02 00 00 00
Символьна константа 'a' - значення 9710=6116 за таблицею ASCII
char −> int
int-> unsigned long int
ВПК: 61 −> 61 00 00 00 00
wchar_t х0=0
wchar_t −> unsigned long int
Mетод: розширення знаком
ВПК: 00 00 −> 00 00 00 00
x3=97+0-2=95
Результат: 95
3. x7 = x4 + x5 + x6 * 0.1
1) 0.1 – типу double
ВПК: 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 long int x6=6
unsigned long int −> int
ВПК: 06 00 00 00 −> 06 00 00 00
int −> double
ВПК: 06 00 00 00 −> 00 00 c0 40 (переведено за допомогою програми з лаб1)
double x7= x4 + x5 + x6 * 0.1=4+5+6*0.1=9.6
Результат: 9.6
4. x8 = x9 + x10 – x11*10
1) unsigned long int x11=11;
ВПК: 0B 00 00 00
2) х9=9
a) signed long int −> int;
ВПК:09 00 −> 09 00 00 00
b)int−>bool;
ВПК:09 00 00 00 −> 00 00 00 00 00 00 22 40
c)bool−>long;
ВПК: 09 00 00 00 00 00 00 00
3) bool x10=10;
ВПК: 0A 00 00 00 00 00 00 00
Результат:
char x8 = x9 + x10 – x11*10
x8=9+10-11*10=19-110= -9110=>-5B16
ВПК 5B : 5B 00 00 00 , оскільки - 5B зробивши інверсію та додавши 1
=> A5 FF FF FF
A5 FF FF FF16 = 429496719610
Результат: 4294967196
4.1 Представлення змінної v3
char v3=*(reinterpret_cast<char*> (&x)+1)+11;
printf("%d %x %c \n", v3,v3,v3);
Нехай у=*reinterpret_cast<char*> (&x)
ВПК int х: 2C 09 00 00 00
char займає 1 байт, маєм що у=2016=0010 1100 , оскільки, знак “+”,
отримаєм: 4410+1110=55
Відповідь: 55 37 7
55 – отриманий результат в 10-ій системі числення;
37 – отриманий результат в 16-ій системі числення (3716=5510);
'7' – З таблиці ASCII під номером 5510 знаходиться символ '7' ;
4.2 Представлення змінної v7
char *v7=reinterpret_cast<char*> (&x);
printf("%d %x %c \n", *v7+1,*v7+2, *v7+3);
int x=026110
x = 02611016
ВПК: 48 09 00 00
Char однобайтний тип, беремо 1 байт + 1 −> 4816 = 7210=0100 1000
*v7+1 =73; - %d –в десятковій формі
*v7+2 = 74; - %x – в шістнадцятко вій формі, 7410=4A16
*v7+3 = 75; - %с – в таблиці ASCII №75 це символ K
Відповідь: 73 4A K
4.3 Представлення змінної w5
short w5=*(reinterpret_cast<short*>(&y)+2)+12;
printf("%x %u %d \n", w5,w5,w5);
double y=1126.0;
short w7=*(reinterpret_cast<short*>(&y)+2)+12
y=*(reinterpret_cast<short*>(&y)+2)
ВПК х: 00 00 00 00 00 98 91 40
&y +1 +2
Оскільки, short займає 2 байта,
то ВПК у : 00 9898 0016 = 1001 1000 0000 0000 00002
0110 0111 1111 1111 1111
1
0110 1000 0000 0000 0000
– приймається як знакове, в результаті
отримаєм 0110 1000 0000 0000 0000 відповідно воно дорівнює -68 0016 = -2662410
-26624 +12 = -26612
Відповідь:FFFF980c 4294940684 -26612
FFFF980c – отриманий результат в 16-ій системі числення в
доповняльному коді (-2661210 => -67F4, оскільки воно відємне, інвертуєм => FFFF980c 16);
4294940684 – отриманий результат в 10-ій системі числення в доповняльному коді(FFFF980c 16=429494068410);
-26612– отриманий результат в 10-ій системі числення
4.4 Представлення змінної w2
long w2=static_cast<long>(y)+55
Оскільки, double- дійсне чило а long- ціле,
то відкидається дробова частина: 1126.0 −> 1126 і додається 55
1126+55=1181
Відповідь: 49D 1181 1181
49D – отриманий результат в 16-ій системі числення(118110=49D16) ;
1181 – отриманий результат представляється як unsigned long, оскільки тип без знаковий а число додатнє , то залишиться таким же;
1181 – отриманий результат в 10-ій системі числення
5.Результати програми
/
ВИСНОВКИ
Я навчився досліджувати методи явного і неявного перетворення типів даних;
ДОДАТОК
Лістинг програми
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
wchar_t x0=0;
unsigned int x1=26;
unsigned long int x2=2;
long double x3=3;
char x4=4; unsigned long int x5=5;
unsigned long int x6=6;
double x7=7;
unsigned int x8=8;
signed long int x9=9;
bool x10=10;
unsigned long 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=026110;
double y=11.26e+2;
char v3=*(reinterpret_cast<char*> (&x)+1)+11;
printf("%d %x %c \n", v3,v3,v3);
char *v7=reinterpret_cast<char*> (&x);
printf("%d %x %c \n", *v7+1,*v7+2, *v7+3);
short w5=*(reinterpret_cast<short*>(&y)+2)+12;
printf("%x %u %d \n", w5,w5,w5);
long w2=static_cast<long>(y)+55;
printf("%lx %lu %ld \n", w2,w2,w2);
getch();
return 0;
}