Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Битовая логика.docx
Скачиваний:
2
Добавлен:
11.07.2019
Размер:
122.24 Кб
Скачать

Оглавление

Представление чисел в памяти ЭВМ 3

Программа для исследования внутреннего представления любых типов 4

Представление беззнаковых целых чисел в памяти ЭВМ 6

Пример 1 6

Пример 2 7

Пример 3 8

Представление знаковых целых чисел в памяти ЭВМ 9

Обратный код 9

Пример 1. 9

Пример 2. 10

Пример 3. 11

Пример 4. 11

Пример 5. 12

Дополнительный код 13

Пример 1. 13

Пример 2. 14

Пример 3. 14

Пример 4. 15

Пример 5. 16

Преобразование из машинного представления в десятичную систему 17

Пример 1. 17

Пример 2. 17

Пример 3. 18

Важное следствие (пример 1). 18

Важное следствие (пример 2). 19

Представление вещественных типов в памяти ЭВМ 21

Пример 1 21

Пример 2 22

Переход в двоичную систему 23

Пример 1. 23

Пример 2 23

Пример 3 24

Пример 4 25

Представление числа «0» в памяти ЭВМ. 25

Общий алгоритм сложения (или вычитания) чисел с плавающей точкой 26

Пример 1 26

Пример 2 27

Алгоритмы работы с числами, которые представлены строкой 28

Сложение положительных чисел, представленных в виде строки 28

Реализация алгоритма на Pascal 30

Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент 32

Реализация алгоритма на Pascal 32

Умножение двух положительных целых чисел, представленных в виде строки 34

Реализация алгоритма на Pascal 35

Сравнение двух целых чисел, представленных в виде строки 37

Реализация алгоритма на Pascal 37

Вычитание целых чисел, представленных в виде строки 39

Реализация алгоритма на Pascal 39

Реализация алгоритмов работы с целыми числами, представленными в виде строки на C# 41

Реализация алгоритмов работы с целыми числами, представленными в виде строки на C++ 44

Представление чисел в памяти эвм

Как известно, все числа делятся на 2 группы – целые и вещественные (дробные). Диапазон значений (и точность у вещественных чисел) зависит от размера ячеек памяти, используемых для их хранения.

В Turbo Pascal существует 5 стандартных вещественных типов:

Название типа

Знаковый

Размер в байтах

Диапазон значений

Byte

Нет

1

0..255

shortint

Да

1

-128..+127

Word

Нет

2

0..65535

Integer

Да

2

-32768..32767

longint

нет

4

-2147483648.. 2147483647

Таблица 1. Стандартные целочисленные типы

Как видно из таблицы, одной из классификаций целочисленных типов может быть: знаковое число и беззнаковое число.

Программа для исследования внутреннего представления любых типов

Для начала напишем программу, которая выводит машинное представление любой переменной. Если читатель мало знаком с Turbo Pascal, то «примите на веру», что программа работает правильно и просто перепишите её.

Любое значение в памяти ЭВМ представляется в виде массива байт в памяти. Так же любое значение имеет адрес, с которого оно начинается и размер в байтах. Размер любой переменной в байтах можно определить с помощью стандартной функции sizeof.

Если передать адрес начала переменной, то нам будет надо переходить на следующий байт в памяти, поэтому необходим указатель на беззнаковый однобайтовый тип (для удобства, что бы не задумываться о том, положительное число или отрицательное), который будет последовательно увеличиваться, переходя при этом на следующий байт в памяти.

Так же необходима функция, которая выводит содержимое байта в двоичном коде. Напомним, что операция and в паскале в том числе является побитовой операцией. Поэтому для вывода значения всех битов в байте нам надо последовательно наложить маску на каждый бит. Для перехода на следующий бит необходимо увеличить маску в 2 раза, т.е. сдвинуть на единицу влево.

Полный код программы приведен ниже:

public static string getBinView(byte value) {

string res = "";

while (value > 0) {

if (value % 2 == 1) {

res = "1" + res;

} else {

res = "0" + res;

}

value = (byte)(value / 2);

}

res = res.PadLeft(8, '0');

return res;

}

static void Main(string[] args) {

unsafe {

string res = "";

Single temp = 4;

byte* pointer = (byte *)&temp;

for (int i = 0; i < sizeof(Single); i++) {

res = getBinView(*pointer) + " " + res;

pointer++;

}

Console.WriteLine(res);

}

Console.ReadKey();

}

uses

crt;

function getStrValue(temp : byte) : string;

var

res : string;

mask : integer;

i : integer;

begin

mask := 1;

res := '';

for i := 1 to 8 do

begin

if (temp and mask = mask) then

res := '1' + res

else

res := '0' + res;

mask := mask shl 1;

end;

getStrValue := res;

end;

procedure writeBytes(startAddr : pointer; size : integer);

var

tempValue : ^byte;

i : byte;

begin

tempValue := startAddr;

for i := 1 to size do

begin

write(getStrValue(tempValue^), ' ');

inc(tempValue);

end;

end;

А это небольшой пример использования данной программы

var

a : integer;

begin

clrscr;

a := 2;

writeBytes(@a, sizeof(a));

end.