Целые числа со знаком
Теперь рассмотрим числа со знаком (англ, signed). Для того чтобы различать положительные и отрицательные числа, в двоичном коде выделяется один бит для хранения знака числа — знаковый разряд. По традиции для этого используют самый старший бит, причём нулевое значение в нём соответствует знаку «плюс», а единичное — знаку «минус». Ноль формально является положительным числом, так как все его разряды, включая знаковый, нулевые.
Поскольку один бит выделяется для хранения информации о знаке, ровно половина из всех 2К чисел будут отрицательными. Учитывая, что одно значение — нулевое, положительных чисел будет на единицу меньше, т. е. допустимый диапазон значений оказывается несимметричным.
Положительные числа записываются в знаковой форме так же, как и в беззнаковой, но для значения остаётся на один разряд меньше. А как поступить с отрицательными числами? Первое, что приходит в голову, это кодировать отрицательные значения точно так же, как и положительные, только записывать в старший бит единицу. Такой способ кодирования называется прямым кодом. Несмотря на свою простоту и наглядность, он не применяется в компьютерах для представления целых чисел 1
. Это неудобно, потому что действия над числами, записанными в прямом коде, выполняются по-разному для разных сочетаний знаков чисел. Поэтому в современных компьютерах отрицательные числа кодируются с помощью другого метода, который менее нагляден, но позволяет выполнять арифметические действия с положительными и отрицательными числами по одному и тому же алгоритму.Как же представить целые числа, чтобы арифметика выглядела максимально просто? Попробуем, например, вычислить код, соответствующий числу —1. Для этого просто вычтем из нуля единицу:
Чтобы вычитание «состоялось», придется занять из несуществующего старшего бита единицу, что не очень естественно, но зато быстро приводит к правильному результату 2. Заметим, что фактически мы вычитали не из 0, а из 256. В общем случае вычисление происходит по формуле 2К - X, где для данного примера К = 8, а Х = 1.
1 Тем не менее прямой код используется в представлении вещественных чисел.
2 Для проверки можно прибавить к полученному коду единицу, в результате должен получиться ноль.
Однако предложенный способ перевода не слишком хорош, поскольку мы использовали дополнительный «несуществующий» разряд. Вместо этого можно использовать равносильный алгоритм:
256 - X = (255 - X) + 1 = not X + 1.
Здесь «not» обозначает логическую операцию «НЕ» (инверсию), применяемую к каждому биту числа отдельно (все нули заменяются на единицы и наоборот).
Следующая страница Алгоритм А1