Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №3
З дисципліни: «Програмування ч.3 Структури і алгоритми»
"Перетворення типів даних"
Львів 2009
1. МЕТА РОБОТИ
Дослідження методів та засобів явного та неявного перетворення типів даних.
2. ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ
Завдання 1:
Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено.
typedef unsigned int type_0;
typedef unsigned short int type_1;
typedef unsigned long int type_2;
typedef signed short int type_3;
typedef signed int type_4;
typedef signed long int type_5;
typedef bool type_6;
typedef char type_7;
typedef wchar_t type_8;
typedef float type_9;
typedef double type_10;
typedef long double type_11;
type_2 x0=0;
type_1 x1=29;
type_5 x2=2;
type_5 x3=3;
type_1 x4=4;
type_5 x5=5;
type_2 x6=6;
type_1 x7=7;
type_3 x8=8;
type_5 x9=9;
type_5 x10=10;
type_2 x11=11;
x1 = x1 - 0xFFFFFFFA;
x3 = 'a' + x0 - x2;
x7 = x4 + x5 + x6 * 0.1;
Завдання 2
Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат.
int x = 0x0529; //х_4 = 0xmndn
float y = 5. 29e+2; // y_2= MN. DN e +2
int v0=*reinterpret_cast<char*> (&x) +3; printf("%d %x %c \n", v0,v0,v0);
int v5=*reinterpret_cast<char*> (&x) +2; printf("%d %x %c \n", v5,v5,v5);
long w1 =*reinterpret_cast<long*>(&y)+33; printf("%lx %lu %ld \n",w1,w1,w1);
long w6 =(*reinterpret_cast<short*>(&y)+3)+13; printf("%x %u %d \n",w6,w6,w6);
3. ПЕРЕТВОРЕННЯ
Завдання 1:
x1 = x1 - 0xFFFFFFFA;
x1 приводиться в int (доповнення нулем), 0xFFFFFFFA – const int, результат приводиться з int в unsigned short int збереженням двох молодших байтів, старший біт втрачає статус знакового.
x3 = 'a' + x0 - x2;
‘a’ – const char (значення 97 за таблицею ASCII) приводиться в long, x0 - unsigned long int приводиться в long старший біт стане знаковим, x2 - signed long int
x3 - signed long int, типи однакові, приведення не буде.
x7 = x4 + x5 + x6 * 0.1;
х6 - unsigned long int, приводиться в float. 0.1 – const float,
х4 - unsigned short int, приводиться в long (доповнення нулем), а потім в float,
x5 - signed long int, приводиться в float.
x7 - unsigned short int, резудбтат арифметичних операцій приводиться з float в long і з long в unsigned short int збереженням двох молодших байтів
x8 = x9 + x10 - x11*10;
x11 - unsigned long int, 10 const int приводиться в long int (доповнення нулем), старший біт втрачає статус знакового, x10 - signed long int, x9 - signed long int, x8 - signed short int, результат арифметичних операцій приводиться з signed long int в signed short int збереженням двох молодших байтів
Завдання 2
int x = 0x0529; в пам’яті знаходиться значеення 29 05 00 00
int v0=*reinterpret_cast<char*> (&x) +3;
*reinterpret_cast<char*> (&x) приводить значення за адресою &x з int в char і збіьлшує його на 3, тобто вибирається молодший байт 29 і збільшується на 3, отримаємо 2С, потім це значиться неявним перетворенням приводиться до типу int.
int v5=*reinterpret_cast<char*> (&x) +2;
Перетворення аналогічні з попереднім, тільки значення молодшого байту збільшується на 2, а не на 3 і в результаті отримаємо 2B
float y = 5. 29e+2; в пам’яті знаходиться значеення 00 40 04 44
long w1 =*reinterpret_cast<long*>(&y)+33;
*reinterpret_cast<long*>(&y) ) приводить значення за адресою &y з float в long і збільшу значення молодшого байта на 3310=2116, тобто в пам’яті знаходиться значеення 21 40 04 44
Що рівне числу 4404402116
float y = 5. 29e+2; в пам’яті знаходиться значеення 00 40 04 44
short w6 =(*reinterpret_cast<short*>(&y)+3)+13;
(*reinterpret_cast<short*>(&y)+3) приводить значення за адресою &y з float в short і збільшу значення молодшого байта на 3. в результаті 2 молодших байта + 3 - 03 40,
При виконанній наступної арифметичної операції неявним перетворенням тип short приводиться до типу int і в пам’яті має вигляд 03 40 00 00 і це значення збільшується на 1310=D16.В результаті отримаємо значення 4003 + D = 4010
4. РЕЗУЛЬТАТИ ВИКОНАННЯ ПРОГРАМИ.
5. ВИСНОВОК:
я навчився використовувати засоби явного і неявного перетворення типів в мові С++.
6. ДОДАТКИ:
#include <stdio.h>
#include <conio.h>
typedef unsigned int type_0;
typedef unsigned short int type_1;
typedef unsigned long int type_2;
typedef signed short int type_3;
typedef signed int type_4;
typedef signed long int type_5;
typedef bool type_6;
typedef char type_7;
typedef wchar_t type_8;
typedef float type_9;
typedef double type_10;
typedef long double type_11;
void main(){
type_8 x0=0;
type_1 x1=29;
type_6 x2=2;
type_6 x3=3;
type_3 x4=4;
type_5 x5=5;
type_0 x6=6;
type_6 x7=7;
type_4 x8=8;
type_0 x9=9;
type_2 x10=10;
type_2 x11=11;
x1 = x1 - 0xFFFFFFFA;
x3 = 'a' + x0 - x2;
x7 = x4 + x5 + x6 * 0.1;
x8 = x9 + x10 - x11*10;
printf ("x1 = %u\nx3 = %d\nx7 = %c\nx8 = %c\n\n",x1,x3,x7,x8);
int x = 0x0529;
float y = 5.29e+2;
int v1 = static_cast< char > (x)+11;
printf("%d %x %c \n", v1,v1,v1);
int v6=*(reinterpret_cast<char*> (&x)+2)+22;
printf("%d %x %c \n", v6,v6,v6);
long w2=static_cast<long>(y)+55;
printf("%lx %lu %ld \n", w2,w2,w2);
short w7=*(reinterpret_cast<short*>(&y)+2)+2;
printf("%x %u %d \n", w7,w7,w7);
}