Число 1238 в типі int: 8310
Обчислюємо значення виразу:
x2 = x2 + x3 – 0123
x2 + x3 – 0123 = 0 – 21 – 83 = - 104 (int) // Результат виразу який присвоюється x2
Результуючим типом буде тип об’єкта якому присвоюється значення, тому -104(int) потрібно перевести в (x2) unsigned short:
Модуль числа 10410 = 6816
Прямий код: 00 00 00 6816
0000 0000 0000 0000 0000 0000 0110 1000 – прямий код
1111 1111 1111 1111 1111 1111 1001 0111 – обернений код
___________________________________1
1111 1111 1111 1111 1111 1111 1001 1000 – доповняльний код
F F F F F F 9 8
ВПК(int): 98 FF FF FF16
ВПК(unsigned short): 98 FF16
Число: FF 9816 = 6543210
Відповідь: x2 = 65432
Завдання 1.3
float x1;
unsigned short x2 = 65432;
Обчислимо значення виразу: x3 = x1+x2 * 0.123 + ’1’;
В виразі праворуч типу операнда розмір якого найбільший є константа типу double, тому x1, x2 та ‘1’ будуть переведені до double. Результат обчислення буде переведено до операнду x3 якому присвоюється вираз, а саме типу short
Оскільки в кінцевому випадку ми переводимо тип double в тип short, то можлива втрата точності.
З попереднього обчислення: x1 = 193.0;
unsigned short x2 = 65414 // Переводимо в тип double
Згідно правил неявного переведення типу:
Число х2 в типі double: 65432.0
Константа символ ‘1’ потрібно перевести в тип double:
Згідно таблиці ASSCI ‘1’ дорівнює 49
Константа символ ‘1’ в типі double матиме значення 49.0
Підставляємо відповідні значення в вираз:
193.0+65432 * 0.123 + 49 = 193.0 + 8048.136 + 49.0 = 8290.136;
В результаті присвоювання і переведення числа в тип short результат буде ціла частина числа: x3 = 8290
Варто підкреслити те, що в даному випадку відбулась втрата точності.
Відповідь: x3 = 8290
Завдання 2.1
…
const int x_1= 013100;
int x = х_1;
…
Обчислимо значення виразу: float v1 = static_cast<float> (x);
Використовуючи оператор явного перетворення static_cast можливі ті перетворення, які можуть бути виконані неявно на основі правил за замовчуванням, але в цьому випадку компілятор не видасть попередження про втрату точності:
constint x_1= 013100;
int x = x_1;
float v1 = static_cast<float> (x);
Цей оператор є альтернативою неявного перетворення, оскільки він узгоджується з правилами неявного перетворення, тому результат для змінної v1 буде:
131008 = 569610
Відповідь: 5696.0
Завдання 2.2
…
const int x_1= 013100;
int x = х_1;
…
Обчислимо значення виразу: char v2 = static_cast<char> (x);
569610 =164016
Число x: 00 00 16 4016
ВПК типу int(х): 40 16 00 0016
ВПК типу char(v2): 40 // беремо 1 байт для типу char
4016=6410
Відповідь: char v2 = 64
Завдання 2.3
…
const int x_1= 013100;
int x = х_1;
…
Обчислимо значення виразу: float v3 =*reinterpret_cast<float*> (&x)+1;
В даному випадку відбувається збільшення отриманого числа на 1, а не зсув адреси:
ВПК типу int (х): 40 16 00 00
ВПК типу float: 40 16 00 00
Число: 00 00 16 4016 = 0000 0000 0000 0000 0001 0110 0100 00002
s = 0
e = 0
m = 000 0000 0001 0110 0100 0000
Значення числа: 1.000 0000 0001 0010 0000 0101 * 2-127 = 0
До отриманого значення додаємо 1.
Відповідь: v3 = 1.0
Завдання 2.4
…
const int x_1= 013100;
int x = х_1;
…
Обчислимо значення виразу: char v4 =*(reinterpret_cast<char*> (&x)+2)+3;
В даному випадку відбувається зсув адреси на 2 одиниці типу char та збільшення числа на 3:
ВПК типу int(х): 40 16 00 00
ВПК для reinterpret_cast<char*> (&x)+2: 00;
ВПК типу char (v4): 03; // До попереднього значення додаємо 3
Відповідь: char v2 = 3
Завдання 2.5
…
const double y_3= - 11.8e1;
double y = y_3;
…
Обчислимо значення виразу: int w1 = static_cast<int>(y)+0x0E2;
Переводимо змінну y яка є типу double в тип int за допомогою правил неявного переведення типу, оскільки використовуємо оператор static_cast:
Значення double y = - 118.0 в типі int її значення буде -118
До попереднього значення додаємо константу 0х0Е216 = 22610
Отож, -11810 + 22610 = 10810
Відповідь: w1= 108
Завдання 2.6
…
const double y_3= - 11.8e1;
double y = y_3;
…
Обчислимо значення виразу: long w2 =*reinterpret_cast<long*>(&y)+1
У виразі праворуч long w2 =*reinterpret_cast<long*>(&y)+1 дана одиниця додається до значення числа, а не виконує зміщення адреси на 1 типу long
Оскільки оператор явного переведення типу reinterpret_cast виконує переведення числа за адресою ВПК, а не значенням як static_cast, то мені необхідно знайти ВПК для double y, а потім вибрати 4 байт з даного ВПК для числа типу long:
double y = y_3; // y = -118
Переводимо цілу частину:
-11810 = - 7616
Число: - 11810 = -7616 = - 0111 01102
s = 1
m: 0111 0110
Нормалізація мантиси: 1,110 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0
Обчислюємо е:
е = 1023 + 6 = 102910 = 100 0000 0101
Форма sem для double:
s
e(11
біт)
m(52
біт)
1 100 0000 0101 110 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0
В 16-овій формі: С0 5D 80 00 00 00 00 0016
ВПК типу double числа y: 00 00 00 00 00 80 5E C016
ВПК типу long: 00 00 00 0016
Число: 0000 0000 0000 0000 0000 0000 0000 00002
Оскільки 1-ий біт 1-го байту числа є 0, то це означає що число є додатне, а отже представлене в прямому коді, тому виконуємо переведення:
00 00 00 0016 = 010
Тепер до отриманого числа 010 додаємо 1 і отримуємо результат для змінної w2:
Відповідь: w2 = 110
Завдання 2.7
…
const double y_3= - 11.8e1;
double y = y_3;
…
Обчислимо значення виразу: short w3 =*(reinterpret_cast<short*>(&y)+2);
Оскільки оператор явного переведення типу reinterpret_cast виконує переведення числа за адресою ВПК, а не значенням як static_cast, то мені необхідно знайти ВПК для double y, а потім вибрати 2 байт з даного ВПК для числа типу short зсунувши адресу на 2 одиниці типу short:
З попередніх обчислень число double y в ВПК:00 00 00 00 00 80 5E C016
short в ВПК займає 2 байти, зсунути на 2 одиниці типу short означає зсунути на 4 байти, тому в-дь буде:
ВПК short: 00 8016
Число: 0000 0000 1000 00002
Оскільки результат є відємне число, то число потрібно представити в прямому коді, а отже потрібно виконувати інверсію та додавати одиницю:
Прямий код: 80 0016
1000 0000 0000 0000 – прямий код
0111 1111 1111 1111 – обернений код
_________________1
1000 0000 0000 0000 – доповняльний код
8 0 0 0
-80 0016 = -3276810
Відповідь: w3 = -3276810
Завдання 2.8
…
const double y_3= - 11.8e1;
double y = y_3;
…
Обчислимо значення виразу: char w4 =*(reinterpret_cast<char*>(&y)+7)+3;
Оскільки оператор явного переведення типу reinterpret_cast виконує переведення числа за адресою ВПК, а не значенням як static_cast, то мені необхідно знайти ВПК для double y, а потім вибрати 1 байт з даного ВПК для числа типу char зсунувши адресу на 7 одиниці типу char і додавши до його значення число 3:
З попередніх обчислень число double y в ВПК: 00 00 00 00 00 80 5E C016
char в ВПК займає 1 байт, зсунути на 7 одиниць типу char означає зсунути на 7 байти, тому в-дь буде:
ВПК char: C0 16
Число: C0 16 = 19210
Тепер до даного числа необхідно додати 3:
19210 + 310 = 19510
Відповідь: char w4 = 195
