В общем случае под целое число можно отвести любое число соседних байтов памяти, однако система команд ПК поддерживает работу с числами только размером в байт и слово и частично поддерживает работу с числами размером в двойное слово (если числа занимают иное количество байтов, то все операции над ними надо реализовывать самому программисту). Поэтому можно считать, что в ПК целые числа представляются только байтом, словом или двойным словом. Именно эти форматы чисел мы и будем рассматривать.
В ПК делается различие между целыми числами без знака (неотрицательными) и со знаком. Это объясняется тем, что в ячейках одного и того же размера можно представить больший диапазон беззнаковых чисел, чем неотрицательных знаковых чисел. Например, в байте можно представить беззнаковые числа от 0 до 255, а неотрицательные знаковые числа - только от 0 до 127. Поэтому, если известно заранее, что некоторая числовая величина является неотрицательной, то выгоднее рассматривать ее как беззнаковую, чем как знаковую.
Отметим "экзотическую" особенность представления чисел в ПК: числа размером в слово и двойное слово хранятся в памяти в "перевернутом" виде". Если на число отведено слово памяти, то старшие (левые) 8 битов числа размещаются во втором байте слова, а младшие (правые) 8 битов - в первом байте; в терминах шестнадцатеричной системы: первые две цифры числа хранятся во втором байте слова, а две последние цифры - в первом байте. Например, число 98 = 0062h хранится в памяти так (А - адреса слова):
Зачем так сделано? Как известно, сложение и вычитание многозначных чисел мы начинаем с действий над младшими цифрами (например, при сложении чисел 1234 и 5678 мы сначала складываем цифры 4 и 8), а затем постепенно переходим к более старшим цифрам. С другой стороны, первые модели ПК (с процессором 8080) были 8-разрядными, в них за раз можно было считать из памяти только один байт. Поскольку в этих условиях многозначное число нельзя считать из памяти сразу целиком, то в первую очередь приходится считывать байт, где находятся младшие цифры числа, а для этого надо, чтобы такой байт хранился в памяти первым. По этой причине в первых моделях ПК и появилось "перевернутое" представление чисел. В последующих же моделях, где уже можно было сразу считать из памяти все число, ради сохранения преемственности, ради того, чтобы ранее составленные программы могли без изменений выполняться на новых ПК, сохранили это "перевернутое" представление чисел.
|
Отметим, что в регистрах числа размером в слово хранятся в нормальном, неперевернутом виде - за этим следят команды пересылки:
"Перевернутое" представление используется и для чисел размером в двойное слово: в первом байте двойного слова хранятся младшие (правые) 8 битов числа, во втором байте – предпоследние 8 битов и т.д. Например, число 1235678h хранится в памяти так
Целые числа со знаком
Эти числа также представляются в виде байта, слова и двойного слова. Как байт можно представить числа от -128 до +127, как слово – от -32768 до 32767, как двойное слово - от -2147483648 до +2147483647.
В ПК знаковые числа записываются в дополнительном коде: неотрицательное число записывается так же, как и беззнаковое число, а отрицательное число x представляется безнаковым числом 2k - |x|, где k – количество разрядов в ячейке, отведенное под число
|
Например, дополнительным кодом числа +98 будет байт 62h или слово 0062h, а дополнительным кодом числа -98 - байт 9Eh (= 158 = 256 - 98) или слово EF(= 216 - 98 = 10000h - 62h).
Приведем еще несколько примеров представления знаковых чисел в дополнительном коде (при ячейке размером в байт):
Из этих примеров видно, что в дополнительном коде самый левый бит играет роль знакового: для неотрицательных чисел он равен 0, а для отрицательных – 1.
Как и беззнаковые, знаковые числа размером в слово и двойное слово записываются в памяти в «перевернутом» виде. Например, число -98 как слово будет хранится в памяти таким образом.
При этом знаковый бит оказывается во втором (правом) байте слова.