Хрестоматия по программированию на Си в Unix




Приложения. Хрестоматия по программированию на Си в Unix - стр. 3


15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | 0| 0| 0| 0| 1| 0| 1| 1| 0| 1| 1| 0| 1| 1| 0| 0| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Тогда unsigned число, записанное в слове, равно

d = 2**15 * b[15] + 2**14 * b[14] + ... 2**1 * b[1] + b[0];

(2**n - это 2 в степени n). Такое разложение числа d единственно. При сложении двух чисел биты складываются по правилам:

0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 и перенос 1 в разряд слева

Числа со знаком интерпретируются чуть иначе. Бит b[15] считается знаковым: 0 - число положительно или равно нулю, 1 - отрицательно. Отрицательные числа хранятся в виде дополнительного кода:

-a = ~a + 1

Например:

2 = 0000000000000010 ~2 = 1111111111111101 ~2+1 = 1111111111111110 = -2 -1 = 1111111111111111 -2 = 1111111111111110 -3 = 1111111111111101 -4 = 1111111111111100 -5 = 1111111111111011

Такое представление выбрано исходя из правила

a + (-a) = 0 знак| 2 = 0|000000000000010 сложим их -2 = 1|111111111111110 ---------|--------------сумма: 10|000000000000000

Как видим, произошел перенос 1 в бит номер 16. Но слово содержит лишь биты 0..15 и бит b[16] просто игнорируется. Получается, что сумма равна

0000000000000000 = 0

что и требовалось. В двоичном коде вычитание реализуется по схеме

a - b = a + (-b) = a + (~b + 1)

Восьмеричные числа соответствуют разбиению двоичного числа на группы по 3 бита и записи каждой группы в виде соответствующей восьмеричной цифры (смотри таблицу выше).

Шестнадцатеричные числа соответствуют разбиению на группы по 4 бита (nibble):

x = 0010011111011001 число: 0010 0111 1101 1001 16-ричное: 0x 2 7 D 9 = 0x27D9 число: 0 010 011 111 011 001 8-ричное: 0 0 2 3 7 3 1 = 023731

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Содержание  Назад