- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Оглавление
Представление чисел в памяти ЭВМ 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.