Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
програмування 2 лаба.doc
Скачиваний:
3
Добавлен:
21.11.2019
Размер:
213 Кб
Скачать
☆
  1. Число 1238 в типі int: 8310

  1. Обчислюємо значення виразу:

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, то можлива втрата точності.

  1. З попереднього обчислення: x1 = 193.0;

  2. unsigned short x2 = 65414 // Переводимо в тип double

Згідно правил неявного переведення типу:

Число х2 в типі double: 65432.0

  1. Константа символ ‘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