- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Представление беззнаковых целых чисел в памяти эвм
Как известно, в К-разрядном двоичном числе может храниться 2k различных значений. Следует отметить, что 0 – это тоже значение, поэтому все максимальные значения беззнаковых типов нечетные. Для знаковых типов количество положительных и отрицательных чисел одинаково, поэтому нижняя граница знаковых типов равна половине количества различных комбинаций, т.е. для k разрядного числа это будет 2k-1. Очевидно, что верхняя граница у знаковых чисел будет (2k-1 - 1).
Общеизвестно, что в 1 байте храниться 8 бит. Таким образом для типа byte отводится 8 разрядов в двоичном представлении, для типа Word – 16 разрядов в двоичном представлении.
Представление целых беззнаковых чисел в памяти ЭВМ совпадает с их двоичным кодом, если не учитывать архитектуру процессора.
Чтобы получить внутреннее представление целого положительного числа N, хранящегося в К-разрядной ячейке, необходимо:
1. перевести число N в двоичную систему счисления;
2. полученный результат дополнить слева незначащими нулями до К разрядов.
3. Возможно инвертировать порядок байт (см. пример 2)
Часто этот формат хранения называют прямым кодом.
Пример 1
Найти представление числа 14 в памяти ЭВМ, если это тип byte.
Решение.
Переведем 1410 в двоичную. Это будет 11102.
Как видно из таблицы [Таблица 1. Стандартные целочисленные типы] размер byte равен 1 байту, т.е. 8 разрядам, и это беззнаковый тип.
Поэтому 1410=11102=000011102.
Зам. для удобства в записи числа вставляют пробелы после каждой четверки разрядов.
1410=11102=000011102=0000 11102
Это и является представлением числа в памяти ЭВМ.
Зам. часто для удобства число записывают в 16ричной системе:
0000 11102 = 0E16
Пример 2
Найти представление числа 1400 в памяти ЭВМ, если это тип word.
Решение.
Переведем 1400 10 в двоичную систему. Это будет 101011110002.
Как видно из таблицы [Таблица 1. Стандартные целочисленные типы] размер word равен 2 байтам, т.е. 16 разрядам, и это беззнаковый тип.
Поэтому 140010=1010 1111 0002=0000 1010 1111 0002.
Зам. для удобства в записи числа вставляют пробелы после каждой четверки разрядов.
0000 1010 1111 0002=057816
Старший байт в этом числе – 05, а младший – 78.
Казалось бы это и является внутренним представлением числа.
Но есть одно но – это уже не однобайтовый тип. Все объекты, большие байта, представляются на разных машинах по-разному, поэтому полагаться на какие-то определенные свойства было бы ошибкой. Короткие целые числа (обычно 16 битов, или 2 байта) могут иметь младший байт, расположенный как по меньшему адресу (иногда называют little-endian, младшеконечное расположение, порядок от младшего к старшему1), чем старший, так и по большему (big-endian, старшеконечное2). Выбор варианта произволен, а некоторые машины вообще поддерживают обе модели.
Таким образом, если машина является младшеконечной, то внутреннее представление числа будет 780516. А если старшеконечная машина, то внутреннее представление числа будет 057816. Поэтому ответ на вопрос о представлении числа в общем случае имеет 2 верных ответа (в данном случае 780516, 057816). Конкретный ответ можно дать только зная тип машины.
Вопрос – как определить, какая у пользователя машина?
Первый вариант – узнать, какой процессор у пользователя. Как показывает статистика, в России распространены процессоры x86.
Второй вариант очень прост – программирование – экспериментальная наука. Надо написать небольшую программу и посмотреть на результирующий файл в 16ричном коде.
Var
Temp : word;
F : file of word;
Begin
Temp := 1400;
Assign(f, ‘test.dat’);
Rewrite(f);
Write(f, temp);
Close(f);
End.
Например на машине, на которой писалось это методическое руководство, содержимое файла было «7805» в 16ричной системе, т.е. это младшеконечная машина.
Пример 3
Найти внутреннее представление числа 700, если это двухбайтовый беззнаковый тип.
Решение.
Переведем 700 из десятичной системы в двоичную.
70010=10 1011 11002.
Т.к. это двухбайтовый тип, то у него 16 разрядов, т.е.
70010=10 1011 11002=0000 0010 1011 11002=02BC16
В этом двухбайтовом числе 02 – старший байт, BC – младший байт.
Тогда для старшеконечной машины внутреннее представление числа будет BC0216, а для младшеконечной машины это будет 02BC16
Представление знаковых целых чисел в памяти ЭВМ
Целые числа со знаком обычно занимают в памяти компьютера один, два или четыре байта. Для хранения целых чисел со знаком старший (левый) разряд в машинном слове отводится под знак числа (если число положительное, то в знаковый разряд записывается ноль, если число отрицательное – единица). Ровно половина из всех 2n чисел будут отрицательными; учитывая необходимость нулевого значения, положительных будет на единицу меньше.
Таким образом, по первому биту в двоичном коде можно определить, положительное число или отрицательно.
Знаковые типы хранятся в памяти машины в дополнительном коде. Однако при работе с дополнительным кодом используется обратный код. Поэтому изучение формата хранения знаковых целых чисел начнем с него.