Рассмотрим самый распространенный способ представления чисел в современных процессорах – дополнительный код. Числа в процессорах хранятся в регистрах фиксированной длины. Каждый регистр состоит из триггеров, который может хранить один бит информации (принимает значение 0 или 1). Соответственно натуральной системой счисления для процессоров является двоичная. Также для компактного представления чисел используется шестнадцатеричная, а для нормального человека натуральной является десятичная. Рекомендуется вспомнить как они образуются, потому что дальше, все три системы счисления будут использоваться повсеместно.
Стандартные длины регистров – это 8, 16, 32, но возможны и другие значения. Рассмотрим, как целые положительные будут представлениы в 8 битном регистре:
Двоичная | Десятичная | Шестнадцатеричная |
0000 0000 | 0 | 00 |
0000 0001 | 1 | 01 |
0000 0010 | 2 | 02 |
0000 0011 | 3 | 03 |
... | ... | ... |
0000 1000 | 8 | 08 |
0000 1001 | 9 | 09 |
0000 1010 | 10 | 0A |
... | ... | ... |
0000 1111 | 15 | 0F |
0001 0000 | 16 | 10 |
... | ... | ... |
1111 1110 | 254 | FE |
1111 1111 | 255 | FF |
Максимальное число ограничено длиной регистра. Например для регистра длиной 8, максимальное число будет 1111 1111 (пробел ставится для наглядности), что в переводе в десятичную систему окажется 255.
Отрицательные числа представляются в дополнительном коде, а точнее в коде дополнения до двух (two’s complement). Отрицательное число в дополнительном коде определяется как величина полученная вычитанием положительного числа из числа, образованного, как 2 в степени N, где N – это длина регистра.
Например, если используется 8 битный регистр, код считается дополнением до 256 (2 в степени 8 равно 256)
Отрицательное число | Расчет | Десятичная | Двоичная | Шестнадцатеричная |
−1 | 256−1 | 255 | 1111 1111 | FF |
−2 | 256−2 | 254 | 1111 1110 | FE |
... | ... | ... | ... | ... |
−127 | 256−127 | 129 | 1000 0001 | 81 |
−128 | 256−128 | 128 | 1000 0000 | 80 |
Если мы и дальше продолжим таблицу, то вновь дойдем до нуля.
Отрицательное число | Расчет | Десятичная | Двоичная | Шестнадцатеричная |
−129 | 256−129 | 127 | 0111 1111 | 7F |
... | ... | ... | ... | ... |
−254 | 256−254 | 2 | 0000 0010 | 2 |
−255 | 256−255 | 1 | 0000 0001 | 1 |
−256 | 256−256 | 0 | 0000 0000 | 0 |
Получается, что один и тот же 8 битный же регистр может хранить числа, как положительные от 0 до 255, так и отрицательные от -1 до -256.
Для представления как положительных, так и отрицательных чисел, весь диапазон делится на две части. Младшие числа от 0 до 127 представляют позитивные значения, а старшие от 128 до 255 представляют отрицательные числа.
В результате мы получаем, что один 8 битный регистр может хранить, как беззнаковое числа в диапазоне от 0 до 255, так и знаковые в диапазоне от -128 до 127.
Рассмотрим, как производятся арифметические действия над беззнаковыми числами на примере операции сложения. Сложение производится над регистрами одинаковой длины (A и B) и если результат сложения не может поместиться в регистр такой же длины (S), то в процессоре устанавливается бит переноса (C), а результат отсекается по длине регистра. Фактически, результирующий регистр (S) удлиняется на один бит за счет бита переноса (C) и содержит верный результат.
A | B | C | S | Результат |
1000 0000 (128) | 0111 1111 (127) | 0 | 1111 1111 | 0 1111 1111 (255) |
1000 0000 (128) | 1000 0000 (128) | 1 | 0000 0000 | 1 0000 0000 (256) |
Рассмотрм операцию вычитания со знаковыми числами.
A | B | C | S | Результат |
1000 0000 (−128) | 0111 1111 (127) | 0 | 1111 1111 | 0 1111 1111 (−1) |
1000 0000 (−128) | 1000 0000 (−128) | 1 | 0000 0000 | 1 0000 0000 (0) |
Внимательно посмотрев на исходные и результирующие значения мы можем заметить, что действия над битами производились одинаково, как для знаковых так и для беззнаковых чисел. То есть для операции сложения знаковых и беззнаковых чисел применяется один и тот же алгоритм (аппаратура). Следует отметить, что не для всех арифметических операций безразлично знаковое или беззнаковое число находится в регистре.
Например, при арифметическом сдвиге вправо отрицательного числа, старший бит будет устанавливаться 1, чтобы число оставалось отрицательным.
Беззнаковый сдвиг вправо | 1000 0000 (128) | 0100 0000 (64) |
Знаковый сдвиг вправо | 1000 0000 (−128) | 1100 0000 (−64) |
Для многих арифметических и логических операций не имеет значение какого типа (знаковое или беззнаковое) число находится в регистре, что позволяет уменьшать сложность счетной аппаратуры при использовании дополнительного кода.