МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
"Представлення в пам’яті комп’ютера
статичних даних"
Kурсовa роботa (Частина 1)
з дисципліни
" Програмування. Частина III.
Структури даних та алгоритми "
14%6=2 ; 8%5=3 ; (2;3)=b,ch3,i6,d3
Представлення рядків символів : № варіанта = (((14*1)%1)*8+1)%30=1;
Представлення переліків : № варіанта = ((14+1)*(1+8)%30=135%30=15;
Представлення масивів : № варіанта = (1*10 +1*8) % 30 = 18;
Представлення структур : № варіанта = (14*3*1+(8%3)*1)%30=14;
Представлення об'єднань : № варіанта = (14+8+1*1+14*8)%30=15;
Львів – 2011
Зміст
Завдання на курсову роботу..........................................................................................................3
Теоретична частина..................................................................................................................8
Алгоритм розв’язання задачі.................................................................................................. 8
Система тестів.........................................................................................................................13
Завдання 1: Внутрішні формати базових типів
3.1.1. Логічний тип..............................................................................................................13
3.1.2. Символьний тип........................................................................................................13
3.1.3. Цілий тип................................................................................................................. 13
3.1.4. Дійсний тип.............................................................................................................. 13
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів...........................................................................................................15
3.2.2. Перерахування...........................................................................................................15
3.2.3. Масив..........................................................................................................................16
3.2.4. Структура...................................................................................................................18
3.2.5. Об'єднання.................................................................................................................19
Результати виконання програми..........................................................................................22
Висновки.................................................................................................................................23
Список літератури................................................................................................................ 24
Додатки......................................................................................................................................... 25
Завдання на курсову роботу
Завдання 1
(день народження студента) % 6=14%6=2;
(місяць народження студента) %5=8%5=3;
(2;3)=b,ch3,i6,d3
bool b;
signed char ch3;
long i6;
long double d3;
3.1.1. Логічний тип.
b = (день народження * 5) % 10 * місяць народження=(14*5)%10*8=0;
3.1.2. Символьний тип
Для надання значень символьним змінним використати одну з літер Прізвища (латинські літери, перша - велика, решта - малі). Якщо прізвище містить менше трьох літер, то замість відсутніх символів записати нулі.
ch3 = третя літера='v';
3.1.3. Цілий тип
i5 = день народження * 352=14*352 = 4928 ;
i6 = – i5= - 4928;
3.1.4. Дійсний тип
Для надання значень дійсним змінним використати такі позначення:
X – день народження, Y – місяць народження, Z = X * Y;
d3 = – Z . X e Y= - 112.8e14;
Завдання 2
3.2.1. Представлення рядків символів
Визначити представлення в пам’яті комп’ютера рядків символів.
Вибір варіанту індивідуального завдання:
№ варіанта = (((день народження * номер будинку) % номер квартири) *
*місяць народження + номер будинку) % 30=(((14*1)%1)*8+1)%30=1;
Для кожного варіанту виконати наступні переприсвоювання:
string№ [0] = символ, що відповідає 3 цифрі номера мобільного телефона;
string№ [2] = символ, що відповідає 4 цифрі номера мобільного телефона;
string№ [4] = символ, що відповідає 5 цифрі номера мобільного телефона;
string№ [6] = символ, що відповідає 6 цифрі номера мобільного телефона;
string№ [8] = символ, що відповідає 7 цифрі номера мобільного телефона;
string№ [10] = символ, що відповідає 8 цифрі номера мобільного телефона;
string№ [12] = символ, що відповідає 9 цифрі номера мобільного телефона;
string№ [14] = символ, що відповідає 10 цифрі номера мобільного телефона;
де № – номер варіанту.
Для студента з номером варіанту 22 і номером мобільного телефона 0958901078 треба виконати такі присвоюння:
char *string1 = "34yf\x3""25\v\\9\6\4\\""24ffh5";
string1 [0] = '5';
string1 [2] = '8';
string1 [4] = '9';
string1 [6] = '0';
string1 [8] = '1';
string1 [10] = '0';
string1 [12] = '7';
string1 [14] = '8';
3.2.2. Представлення переліків
Вибір варіанту індивідуального завдання:
№ варіанта = ((день народження + номер будинку) * (номер квартири + місяць народження)) %30=((14+1)*(1+8)%30=135%30=15;
enum color15 {
BLUE,
GREEN,
CYAN,
RED,
BROWN = 3,
GRAY,
YELLOW,
WHІTE = 2,
MAGENTA,
LІGHTGRAY,
DARKGRAY,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY
3.2.3. Представлення масивів
Вибір варіанту індивідуального завдання:
№ варіанта = (номер будинку * 10 + номер квартири * місяць народження) % 30= =(1*10 +1*8) % 30 = 18;
wchar_t array18[][3][2] = {{7,6,}, {234,56}}
Для кожного варіанту виконати наступні переприсвоюння:
1-ий елемент масиву = (1-ша цифра номера мобільного телефона) * (на день народження);
2-ий елемент масиву = (2-га цифра номера мобільного телефона) * (на день народження);
3-ий елемент масиву = (3-тя цифра номера мобільного телефона) * (на день народження);
4-ий елемент масиву = (4-та цифра номера мобільного телефона) * (на день народження);
5-ий елемент масиву = (5-та цифра номера мобільного телефона) * (на день народження);
6-ий елемент масиву = (6-та цифра номера мобільного телефона) * (на день народження);
7-ий елемент масиву = (7-ма цифра номера мобільного телефона) * (на день народження);
8-ий елемент масиву = (8-ма цифра номера мобільного телефона) * (на день народження);
9-ий елемент масиву = (9-та цифра номера мобільного телефона) * (на день народження);
10-й елемент масиву = (10-та цифра номера мобільного телефона) * (на день народження);
Для студента з номером варіанту 18, номером мобільного телефона 0958901078 і днем народження 14 серпня.
wchar_t array18[][3][2] = {{7,6,}, {234,56}}
array0[0][0][0] = 0; // 0 * 14 = 0
array0[0][0][1] = 126; // 9 * 14 = 126
array0[0][1][0] = 70; // 5 * 14 = 70
array0[0][1][1] = 112 ; // 8 * 14= 112
array0[0][2][0] = 126; // 9 * 14= 126
array0[0][2][1] = 0; // 0 * 14 = 0
array0[1][0][0] = 14; // 1 * 14= 14
array0[1][0][1] = 0; // 0 * 14 = 0
array0[1][1][0] = 98; // 7 * 14 = 98
array0[1][1][1] = 112; // 8 * 14= 112
В результаті масив набуде такого вигляду:
array0[0][0][0] = 0; array0[0][0][1] = 126;
array0[0][1][0] = 70; array0[0][1][1] =112;
array0[0][2][0] = 126; array0[0][2][1] = 6;
array0[1][0][0] = 14; array0[1][0][1] = 0;
array0[1][1][0] = 98; array0[1][1][1] = 112;
array0[1][2][0] = 0; array0[1][2][1] = 0;
3.2.4. Представлення структур
Вибір варіанту індивідуального завдання:
№ варіанта = (день народження * 3 * номер квартири + (місяць народження % 3) * номер будинку) % 30=(14*3*1+(8%3)*1)%30=14;
struct str14 {
unsigned e:3;
float a;
unsigned short b:4;
unsigned short :0;
unsigned long d;
char c[6];
signed :5;
long :2;
char f;
}str;
Для кожного варіанту виконати надання значень елементам структури :
str.a = D.DM=14.112; // замість D підставити свій день народження
// замість DM підставити значення, що дорівнює
// добутку дня народження на місяцьнародження
str.b = 1* 1* 124=124; // замість BD підставити номер свого будинку
// замість KV підставити номер своєї квартири
Для надання значень елементам масиву str.c використати одну з літер Прізвища (латинські літери, перша - велика, решта - малі). Якщо прізвище містить менше 5 літер, то замість відсутніх символів присвоїти нулі.
str.c[0] = перша літера= 'T' ;
str.c[1] = друга літера= 's' ;
str.c[2] = третя літера= 'v';
str.c[3] = четверта літера ='i';
str.c[4] = п'ята літера = 'g' ;
str.d = 764 * 1 * 9=6876; // замість BD підставити номер свого будинку
// замість Х підставити шосту з кінця цифру номера
// мобільного телефона
str.e = 14 * 8 * 36=4032; // замість DN підставити свій день народження
// замість MN підставити свій місяць народження
str.f = 8; // замість Y підставити останню цифру номера
// мобільного телефона
3.2.5. Представлення об'єднань
Вибір варіанту індивідуального завдання:
№ варіанта = (день народження + місяць народження + номер квартири * номер будинку +
день народження * місяць народження) % 30=(14+8+1*1+14*8)%30=15;
union un15 {
struct {
float f[2];
wchar_t a[10];
};
struct {
float e;
short c;
};
} un;
Для кожного варіанту виконати надання значень елементам об'єднання :
un.e = KV * 325 + YEAR * DN=1*325+1992*14=28213;
// замість KV підставити номер своєї квартири
// замість YEAR підставити свій рік народження
// замість DN підставити свій день народження
un.c = DN * (MN + BD) * 100=14*(8+1)*100=12600;
// замість MN підставити свій місяць народження
// замість BD підставити номер свого будинку
un.a[0] = символ, що відповідає 6 цифрі номера мобільного телефона='0';
un.a[1] = символ, що відповідає 7 цифрі номера мобільного телефона='1';
un.a[2] = символ, що відповідає 8 цифрі номера мобільного телефона='0';
un.a[3] = символ, що відповідає 9 цифрі номера мобільного телефона='7';
un.a[4] = символ, що відповідає 10 цифрі номера мобільного телефона='8';
Теоретична частина і aлгоритм розв’язання задачі.
Завдання 1
В мові C++ логічний тип (bool) характеризується двома значеннями: false (0) і true (1). На відміну від мови С++ в мові С логічний тип даних іменується Bool, але при включенні заголовочного файлу <stdbool.h> можна використовувати ключові слова bool, true, false.
В пам'яті комп'ютера змінна типу bool займає 1 байт. Логічні значення можна асоціювати зі значеннями типу int: значенню false відповідає нуль, значенню true відповідають всі інші числа.
В арифметичних і логічних виразах логічні значення перетворюються в цілі числа. Арифметичні та бітові логічні операції виконуються над перетвореними величинами. Якщо результат приводиться знову до логічного типу, то 0 перетворюється в false, а ненульове значення перетворюється в true.
bool x = true; // в пам’яті комп’ютера змінна х зберігається як послідовність: 0000 0001
bool y = false; // в пам’яті комп’ютера змінна y зберігається як послідовність: 0000 0000
bool a = 2*x+y; // значення виразу 2*x+y дорівнює 2, тому змінна a отримує значення
// true (1); отже, в пам’яті комп’ютера змінна a зберігається як наступна
// послідовність біт: 0000 0001 (або в 16-ковій системі числення як 01)
Типи short, іnt і long призначені для представлення цілих чисел.
Цілі типи можуть бути знаковими (sіgned) і беззнаковими (unsіgned). В знакових типах самий лівий біт використовується для зберігання знака числа (0 – плюс, 1 – мінус). Решта бітів містять числове значення. В беззнакових типах всі біти використаються для числового значення. За замовчуванням всі цілочисельні типи вважаються знаковими.
Цілі типи розрізняються діапазоном значень, які можуть приймати цілочисельні змінні і розміром області пам'яті, виділеної під цю змінну, а конкретні розміри перерахованих типів залежать від конкретної реалізації.Внутрішнє представлення змінної цілого типу — ціле число у двійковому коді. Згідно формату IEEE всі додатні цілі числа зберігаються в пам'яті комп'ютера в прямому коді, а всі від'ємні – в доповняльному коді. Цілі числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Дійсні константи записуються у двох формах – з фіксованою десятковою крапкою або в експонентному виді. В першому випадку крапка використовується для поділу цілої і дробової частин константиВ пам'яті комп'ютера змінна типу float займає 4 байти, в яких один біт виділяється під знак, 8 – під порядок, 23 – під мантису.
Розряди мантиси включають один розряд цілої частини, що завжди дорівнює одиниці, і фіксовану кількість розрядів дробової частини. Оскільки старший двійковий розряд мантиси завжди дорівнює одиниці, зберігати його необов'язково, і у двійковому коді він відсутній. Фактично двійковий код зберігає тільки розряди дробової частини мантиси. Отже, насправді, у типу float мантиса містить 24 розряди, але старший розряд завжди дорівнює одиниці, тому зберігати його не потрібно.
Тип double займає 8 байт, у яких один розряд виділяється під знак, 11 – під порядок, 52 – під мантису. Насправді в мантисі 53 розряди, але старший завжди дорівнює одиниці і тому не зберігається.
Тип long double займає 10 байт (або 8 байт), в яких один розряд виділяється під знак, 15 – під порядок, інші 64 – під мантису. Записуються всі 64 розряди мантиси разом зі старшою одиницею.
Оскільки порядок може бути додатній і від'ємний, у двійковому коді він зберігається в зміщеному виді: до нього додається константа, яка рівна абсолютній величині максимального по модулю від'ємного порядку. У випадку типу float вона дорівнює 127, у випадку double – 1023, long double – 16383. Таким чином, максимальний по модулю від'ємний порядок представляється нульовим кодом.
Дійсні числа зберігаються в пам'яті комп'ютера у зворотньому порядку розміщення байт числа.
Завдання 2
3.2.1. Представлення рядків символів
Ідентифікатором символьного типу є ключове слово char.
Символьні константи (символьні літерали) можна представляти як:
клавіатурні: '1','s','Y' – записуються як символи в одинарних лапках;
кодові: '\n','\\','\?', які використовуються для представлення деяких керуючих символів та символів-розділювачів – записуються як escape-послідовності (вони починаються з символу зворотної косої риски).
Назва
Кодові символьні літерали
Код
Новий рядок
\n
0A
Горизонтальна табуляція
\t
09
Забій
\b
08
Вертикальна табуляція
\v
0B
Повернення каретки
\r
0D
Прогін аркуша
\f
0C
Дзвінок
\a
07
Зворотня коса риска
\\
5C
Знак питання
\?
3F
Одиночні лапки
\'
27
Подвійні лапки
\"
22
Не дивлячись на свій зовнішній вигляд, це одиночні символи.
кодові числові: '\0','\x5C','\124', які використовуються для представлення будь-яких символів – записуються у вигляді однієї, двох або трьох вісімкових цифр з символом зворотної косої риски ( \ ) перед ними або довільним шістнадцятковим числом з послідовністю \х перед ним. Послідовність вісімкових або шістнадцяткових цифр закінчується першим символом, який не є відповідно вісімковою або шістнадцятковою цифрою. .
Десяткова
Вісімкова
Шістнадцяткова
Символ
7
'\7'
'\x7'
Дзвінок
48
'\60'
'\x30'
'0'
50
'\062'
'\x32'
'2'
95
'\137'
'\x005f'
'_'
В пам’яті комп’ютера дані символьного типу зазвичай займають 1 байт. В цей байт записується порядковий номер символа в таблиці ASCII.Якщо в тесті програми йдуть підряд два або декілька рядкових літералів, то компілятор з'єднує їх в один рядок. Наприклад, текст "two" "some" породить рядок символів "twosome".
Фактично рядковий літерал являє собою масив символьних констант, в якому останнім елементом завжди є спеціальний символ з кодом 0 (\0). Наприклад, символьний літерал 'A' задає єдиний символ А, а рядковий літерал "А" - масив із двох елементів: 'А' і \0 (порожній символ).
Символи рядка запам'ятовуються в окремих байтах пам'яті. Символ нуль є відміткою кінця рядка. Він невидимий у рядковому виразі, але він додається як останній елемент, коли рядок запам'ятовується.
3.2.2. Представлення переліків
Значенням кожного імені списку є деяке ціле число. Змінна типу переліку може приймати значення однієї з іменованих констант списку. Змінні типу enum можуть використовуватись і як операнды в арифметичних операціях та в операціях відношення, і як індекси в індексних виразах.Кожен ідентифікатор іменує елемент переліку. Всі ідентифікатори в списку переліку повинні бути унікальними і повинні відрізнятись від всіх інших ідентифікаторів в тій самій області видимості, включаючи імена звичайних змінних та ідентифікатори з інших списків переліку.
У випадку відсутності константного виразу перший ідентифікатор набуває значення 0, наступний ідентифікатор - значення 1, наступний - 2 і т.д. Отже, пам'ять, що відводиться під змінну типу перелік - це пам'ять, необхідна для розміщення значення типу іnt.
Ідентифікатор, зв'язаний з константним виразом, приймає значення, що задається цим константним виразом. Константний вираз повинен мати тип іnt і може бути як додатнім, так і від’ємним. Константні вирази можуть містити однакові значення. Наступний ідентифікатор в списку отримує значення, рівне константному виразу плюс 1, якщо цей ідентифікатор не має свого константного виразу.
3.2.3. Представлення масивів
Масив - це впорядкований скінченний набір даних одного типу, які зберігаються в послідовно розташованих комірках оперативної пам'яті і мають спільну назву. З оголошення масиву компілятор одержує інформацію про тип елементів масиву та їх кількість.
Для роботи з масивом його елементи індексуються (нумеруються), а доступ до них здійснюється за допомогою операції взяття індексу. В мові С++ індексація масивів починається з 0, тому елемент із індексом 1 насправді є другим елементом масиву, а індекс першого дорівнює 0. Індекс може бути цілим числом або цілим виразом. Якщо в якості індекса використовується вираз, то спочатку обчислюється вираз, щоб визначити конкретний елемент масиву з яким буде виконуватись робота.
В мові С++ також використовуються багатовимірні масиви, при оголошенні яких необхідно вказувати праву границю кожного виміру в окремих квадратних дужках. При звертанні до елементів багатовимірного масиву необхідно вказувати індекси для кожного виміру.
Багатовимірні масиви можуть отримувати початкові значення в своїх оголошеннях так само, як і одновимірні масиви. При ініціалізації багатомірного масиву він представляється як масив масивів, при цьому кожен масив знаходиться у своїх фігурних дужках (у цьому випадку ліву розмірність при описі можна не вказувати).Елементам масиву можна задати початкові значення (ініціалізувати їх) в оголошенні масиву за допомогою списку, що знаходиться одразу після оголошення. Список містить однакові за змістом початкові значення, розділені комами і обмежені фігурними дужками. Початкові значення присвоюються першому рядку матриці.Якщо початкових значень в деякому підрядку не вистачає для їх присвоєння всім елементам рядка масиву, то всім решта елементам рядка, що залишились, присвоюються нульові початкові значення. Однак, по замовчуванню автоматично масив не отримує нульові початкові значення неявно. Треба присвоїти нульові початкові значення хоча б першому елементу для того, щоб автоматично були обнулені всі решта елементів.
Наприклад, двовимірний масив b[2][2] можна оголосити і надати йому початкові значення наступним чином:
int b[][2]={{1, 2},{3, 4}}; //аналогічно присвоєнням: b[0][0]=1; b[0][l]=2; b[1][0]=3; b[1][1]=4;
Якщо початкових значень в деякому підрядку не вистачає для їх присвоєння всім елементам рядка масиву, то всім решта елементам рядка, що залишились, присвоюються нульові початкові значення. Наприклад, оголошення
int b[2][2] = {{1, } , {3, 4}};
буде означати, що b[0][0] отримує початкове значення 1, b[0][1] отримує початкове значення 0, b[1][0] отримує початкове значення 3 і b[1][1] отримує початкове значення 4.
Якщо зі списку початкових значень забрати всі фігурні дужки навколо кожного підрядка, то компілятор автоматичнонадасть перші початкові значення елементам першого рядка масиву, а наступні – елементам другого рядка масиву. Наприклад, оголошення
int b[2][3] = {1, 2, 3, 4, 5};
містить 5 початкових значень. Початкові значення присвоюються першому рядку матриці:
b[0][0] = 1; b[0][1] = 2; b[0][2] = 3;
решта – другому рядку. Довільні елементи, що не мають явно заданих початкових значень, автоматично отримують нульові початкові значення. Отже:
b[1][0] = 4; b[1][1] = 5; b[1][2] = 0;
Багатовимірні масиви компілятор розглядає як послідовність одновимірних, тому до елементів такого масиву, як і для одновимірних, можна також звертатись через вказівники.
Мова С++ не забезпечує контролю індексів масиву - ні на етапі компіляції, ні на етапі виконання. Програміст сам повинен стежити за тим, щоб індекс не вийшов за межі масиву. Помилки при роботі з індексами досить поширені.
В пам'яті комп'ютера елементи масиву з першого до останнього запам'ятовуються в послідовних зростаючих комірках пам'яті. Між елементами масиву в пам'яті розриви відсутні. Елементи масиву з найменшим індексом зберігаються по найменшій адресі пам’яті. Розмір пам’яті, що відводиться для зберігання масиву, обчислюється за формулою:
Memory = кількість елементів масиву * розмір одного елемента
Багатовимірні масиви в пам'яті комп'ютера зберігаються так, що найбільш правий індекс збільшується першим.
3.2.4. Представлення структур
На відміну від масиву, всі елементи якого однотипні, структура може містити елементи різних типів.
Елементи структури називаються полями структури і можуть мати будь-які типи, крім типу цієї ж структури, але можуть бути вказівниками на неї. Якщо відсутнє ім'я типу, то повинен бути заданий список оголошень перемінних, вказівників або масивів. В цьому випадку опис структури служить визначенням елементів цього списку, наприклад:
В пам'яті комп’ютера під кожний елемент структури виділяється визначений відповідно до типу цього елемента об’єм памяті. Елементи в пам'яті зберігаються в тому ж порядку, в якому вони були представлені в описі структури.
Розмір змінної структурного типу не можна обчислити просто як суму його елементів, тому що змінні певних типів мають вирівнюватись в пам'яті комп’ютера по деяким залежним від реалізації границям, наприклад, повинні бути вирівняні по границі слова. Це може призводити до "дірок" в структурі. Значення в таких "дірках" невизначені. Навіть якщо значення двох змінних одного й того ж структурного типу дійсно рівні між собою, то не обов’язково, що при порівнянні вони виявляться рівними один одному, оскільки малоймовірно, що невизначені "дірки" містять однакові значення. Отже, порівняння структур є синтаксичною помилкою через різні вимоги по вирівнюванню в різних системах.
Елементи в пам'яті зберігаються в тому ж порядку, в якому вони були представлені в описі структури.
Насправді, довжина структури sіzeof (ех) не дорівнює сумуванню довжин всіх полів як можна було б очікувати. Причина цього полягає в тому, що деякі поля певних типів вирівнюються в пам'яті комп’ютера по границі слова (або подвійного слова, або півслова).
3.2.5. Представлення об'єднань
Oб'єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.
Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси
Система тестів
Завдання 3.1
3.1.1. Логічний тип
bool b = 0 = false; в пам’яті комп’ютера змінна y зберігається як послідовність: 00 = =0000 0000 .
3.1.2. Символьний тип
За системою ASCII символ ’v’ має порядковий номер 11810 = 7616 = 0111 01102
Отже, цей символ в пам’яті комп’ютера буде представлений як послідовність: 0111 01102 .
3.1.3. Цілий тип.
Від'ємне число - 4928 типу long int в пам'яті комп’ютера зберігається в доповняльному двійковому коді і займає 4 байти: - 492810 = - 134016 = - 0001 0011 0100 00002
0000 0000 0000 0000 0001 0011 0100 0000 - прямий код;
1111 1111 1111 1111 1110 1100 1011 1111 - обернений код;
+ 1
1111 1111 1111 1111 1110 1100 1100 0000 - доповняльний код;
F F F F E C C 0 - в 16- ковій системі числення
В пам’яті комп’ютера зберігається у зворотному порядку розміщення байт числа:
1100 0000 1110 1100 1111 1111 1111 1111
Результат в 16- ковій системі числення: C0 EC FF FF.
3.1.4. Дійсний тип
d3 = - 112.14e8 = - 112 1400 0000
Розмір типу long double для різних компіляторів може відрізнятися, наприклад для BCB 6.0 буде займати 10 байт, для VC++ 6.0 буде займати 8 байт (в цьому випадку формат збереження типу long double співпадає з форматом типу double).
Тип double займає 8 байт, у яких один розряд виділяється під знак, 11 – під порядок, 52 – під мантису. Насправді в мантисі 53 розряди, але старший завжди дорівнює одиниці і тому не зберігається.
1 біт 11 біт 52 біта
s
e
m
Перевід цiлої частини:
112 1400 0000 : 16 = 70 0875 0000 | 0
70 0875 0000 : 16 = 4380 4687 | 8
4380 4687 : 16 = 273 7792 | 1510 = F16
273 7792 : 16 = 17 1112 | 0
17 1112 : 16 = 10694 | 8
10694 : 16 = 668 | 6
668 : 16 = 41 | 1210 = C16
41 : 16 = 2 | 9
2 : 16 = 0 | 2
Отже: 112 1400 0000 10 = 29C680F8016 = 0010 1001 1100 0110 1000 0000 1111 1000 0000.2
Нормалізація: 001,0 1001 1100 0110 1000 0000 1111 1000 0000
Визначення мантиси: m=0100 1110 0011 0100 0000 0111 1100 0000 0000 …. 00002
Визначення зміщеного порядку: е = 102310 + 3310 = 105610 = 100 0010 00002
Визначення знакового розряду: s = 1 (бо число від'ємне).
Зборка за схемою:
s
e
m
1
100 0010 0000
0100 1110 0011 0100 0000 0111 1100 0000 0000 …. 0000
В 16- ковій системі числення: 1100 0010 0000 0100 1110 0011 0100 0000
0111 1100 0000 0000 0000 0000 0000 0000 2= C204E3407C000000 16
В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа:
0000 0000 0000 0000 0000 0000 0111 1100 0100 0000 1110 0011 0000 0100 1100 0010
Результат в 16- ковій системі числення: 00 00 00 7C 40 E3 04 C2.
3.2 Завдання 2
3.2.1. Представлення рядків символів
char *string1 = "34yf\x3""25\v\\9\6\4\\""24ffh5";
string1 [0] = '5';
string1 [2] = '8';
string1 [4] = '9';
string1 [6] = '0';
string1 [8] = '1';
string1 [10] = '0';
string1 [12] = '7';
string1 [14] = '8';
"34yf\x3""25\v\\9\6\4\\""24ffh5"= "34yf\x325\v\\9\6\4\\24ffh5";
string[]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
символи
3
4
y
f
\x3
2
5
\v
\\
9
\6
\4
\\
2
4
f
f
h
5
заміна
5
4
8
f
9
2
0
\v
1
9
0
\4
7
2
8
f
f
h
5