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