Страницы

Представление целых чисел в процессорах

Рассмотрим самый распространенный способ представления чисел в современных процессорах – дополнительный код. Числа в процессорах хранятся в регистрах фиксированной длины.  Каждый регистр состоит из триггеров, который может хранить один бит информации (принимает значение 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)

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