Программирование >>  Структурное программирование 

1 ... 329 330 331 [ 332 ] 333 334 335 ... 342


Преобразование шестнадцатеричного числа AD3B в десятичное 44347 выполняется тем же самым способом с использованием соответствующих позиционных значений шестнадцатеричной системы счисления, как показано на рис. Г. 10.

Преобразование шестнадцатеричного числа в десятичное

Позиционные значения

4096

Числовые значения

Произведения

А*4096=40960

0*256=3328

3*16=48

В*1=11

Сумма

40960-1-3328-1-48-1-11=44347

Рис. Г.Ю. Преобразование шестнадцатеричного числа в десятичное

Г.5. Преобразование десятичных чисел в двоичные, восьмеричные и шестнадцатеричные

Правила преобразования, изложенные в предыдущем разделе, естественным образом вытекают из правил записи числа в позиционной системе счисления. Преобразование десятичных чисел к двоичному, восьмеричному или шестнадцатеричному представлению также выполняется в соответствии с этими соглашениями.

Предположим, что мы хотим преобразовать десятичное число 57 в двоичное. Начнем с того, что выпишем значения позиций двоичной системы в колонки, справа налево, пока не дойдем до позиционного значения, превосходящего наше десятичное число. Эта позиция нам не нужна и мы отбрасываем этот столбец. Таким образом, сначала мы запишем:

Позиционные значения: 64 32 16 8 4 2 1

Затем мы отбрасываем столбец с позиционным значением 64:

Позиционные значения: 32 16 8 4 2 1

После этого начинается процесс обработки столбцов, с крайнего левого столбца и далее, до крайнего правого. Мы делим 57 на 32, получаем 1 и остаток 25; записываем 1 в столбце 32. Далее, мы делим остаток 25 на 16, получаем 1 и 9 в остатке; записываем 1 в столбце 16. Затем, делим 9 на 8, получаем 1 и 1 в остатке. Для следующих двух столбцов частное от деления остатка равного 1 на их позиционные значения равны О, так что в эти столбцы мы записываем нули. Для крайней правой позиции число 1, деленное на 1, дает 1 и мы записываем 1 в столбец единиц. В результате получаем:

32 16 8 4 2 1 1 1 10 0 1

Позиционные значения: Значения цифр

и, таким образом, десятичному числу 57 будет соответствовать двоичное число 111001.

Для преобразования десятичного числа 103 в восьмеричное начнем с того, что последовательно выпишем позиционные значения восьмеричной системы в столбцы, пока не дойдем до значения позиции, превосходящей наше десятичное число. Этот столбец нам не нужен и мы его отбросим. Таким образом, сначала мы запишем:

Позиционные значения: 512 64 8 1

Затем мы отбрасываем столбец с позиционным значением 512 и получаем: Позиционные значения: 64 8 1

После этого мы начинаем обработку с крайнего левого столбца и далее до крайнего правого. Мы делим 103 на 64, получаем 1, остаток 39 и записываем 1 в столбце 64.



Г.6. Представление отрицательных двоичных чисел:

дополнение до двух

Все предыдущие разделы этого приложения касались только положительных чисел. В этом разделе мы расскажем, как в памяти компьютера представляются отрицательные числа при помощи метода дополнения до двух. Сначала мы опишем сам метод получения дополнения заданного двоичного числа до двух, а затем покажем, что это дополнение действительно представляет значение данного двоичного числа со знаком минус.

Рассмотрим вычислительную машину, в которой для представления целых чисел используется 32 бита. Определим значение

int value = 13;

Представление value в виде 32-битового целого будет иметь следующий вид:

00000000 00000000 00000000 00001101

Чтобы сформировать отрицательное значение value, сначала выполним дополнение до единицы (поразрядное дополнение), при помощи поразрядной операции дополнения (-) языка С-Ь+ :

ones complement of value = -value;

Внутреннее представление -value получается из представления value побитовым инвертированием: единицы заменяются нулями, а нули становятся единицами, как это показано ниже:

value:

00000000 00000000 00000000 00001101

Далее, мы делим 39 на 8, получаем 4 и 7 в остатке и записываем 4 в столбце восьмерок. И, наконец, мы делим 7 на 1, получаем 7 и О в остатке и записываем 7 в столбце единиц. В результате получаем:

Позиционные значения: 64 8 1

Значения цифр: 14 7

Таким образом, десятичному числу 103 соответствует восьмеричное число 147.

Для преобразования десятичного числа 375 в шестнадцатеричное начнем с того, что выпишем значения позиций шестнадцатеричной системы в столбцы, пока не дойдем до позиционного значения, превосходящего наше десятичное число. Этот столбец нам не нужен и мы его отбросим. Таким образом, сначала мы запишем:

Позиционные значения: 4096 256 16 1

Затем мы отбрасываем столбец с позиционным значением 4096 и получаем:

Позиционные значения: 256 16 1

После этого мы начинаем обработку столбцов с крайнего левого столбца и далее до крайнего правого. Мы делим 375 на 256, получаем 1, остаток 119 и записываем 1 в столбце 256. Далее, мы делим 119 на 16, получаем 7 и 7 в остатке и записываем 7 в столбце 16. И, наконец, мы делим 7 на 1, получаем 7 и О в остатке и записываем 7 в столбце единиц. В результате получаем:

Позиционные значения: 256 16 1

Значения цифр: 1 7 7

Таким образом, десятичному числу 375 соответствует шестнадцатеричное число

177.



00000000 00000000 00000000 00000000

Разряд переноса, в который выталкивается единица из крайнего левого столбца, отбрасывается и мы действительно получаем нуль. Если мы сложим число и дополнение этого числа до единицы, то в результате получим значение, все разряды которого равны единице. При использовании дополнения до двух все разряды получаются нулевыми только потому, что дополнение до двух на единицу больше, чем дополнение до единицы. При добавлении 1 в любой разряд, содержащий 1, получается О для данного разряда и единица переносится в следующий разряд слева. Процесс переноса продолжается, пока единица не будет вытолкнута из крайнего левого разряда и отброшена; в результате все разряды итогового числа будут нулевыми и мы получим в ответе нуль.

При выполнении операции вычитания типа

X = а - value;

компьютер, на самом деле, выполняет операцию сложения а и дополнения до двух величины value, т. е.:

X = а + (-value + 1);

Предположим что значение а равно 27 и значение value равно 13, как и прежде. Если дополнение до двух value дает значение -13, то при сложении этой величины со значением а должен быть получен результат 14. Давайте проверим, так ли это:

а (т. е. 27) 00000000 00000000 00000000 00011011

+(~value +1) +11111111 11111111 11111111 11110011

00000000 00000000 00000000 00001110 В итоге мы действительно получили число, равное 14.

Резюме

Когда мы используем в программе на С++ целое число, например 19, или 227, или -63, то предполагаем, что оно записано в десятичной системе счисления (с основанием 10). Цифрами в десятичной системе счисления являются О, 1, 2, 3, 4, 5, 6, 7, 8, и 9. Самая младшая цифра - это О, а самая старшая цифра - 9, на единицу меньшая, чем 10 - основание системы счисления.

Для внутреннего представления данных в компьютере используется двоичная система счисления (с основанием 2). Двоичная система счисления обходится только двумя цифрами, а именно, О и 1. Самая младшая цифра - О, а самая старшая цифра - 1, на единицу меньшая основания системы счисления 2.

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

~value (т. е. побитовое дополнение числа value): 11111111 11111111 11111111 11110010

Чтобы получить дополнение до двух (точное дополнение) для значения value, нужно просто добавить единицу к дополнению этого числа до единицы. Таким образом, дополнение до двух значения value:

11111111 11111111 11111111 11110010

Теперь, если полученное число действительно равно -13, то мы можем прибавить его к двоичному значению числа 13 и должны в результате получить 0. Давайте попробуем:

00000000 00000000 00000000 00001101 +11111111 11111111 11111111 11110011



1 ... 329 330 331 [ 332 ] 333 334 335 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика