Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
216 Часть //. Программирование микроконтроллеров АVR на ассемблере определены для обычных положительных чисел. И представление отрицательных чисел в машине должно этим правилам соответствовать. Напрашивающийся метод представления отрицательных чисел - отвести один бит (логичнее всего - старший) для хранения знака. По причинам, которые вы пой мете далее, значение 1 в этом бите означает знак «минус», а о - знак «плюс» . Как будут выглядеть двоичные числа в таком представлении? В области положительных чисел ничего не изменится, кроме того, что их диапазон сократится вдвое, - например, для числа в байтовом представлении вместо диапа зона 0 . .255 мы получим всего лишь 0 . . 1 27 ( о о о о 0 0 0 0 . . . 0 1 1 1 1 1 1 1) . А отрица тельные числа будут иметь тот же диапазон, только старший бит у них будет равен единице ( 1 28 . .255 , или 1 0 0 0 0 0 0 0 . . . 1 1 1 1 1 1 1 1) . Все просто, не правда ли? Нет, неправда. Такое представление отрицательных чисел совершенно не соответ ствует обычной числовой оси, на которой влево от нуля идет минус единица, а за тем числа по абсолютной величине увеличиваются. Здесь же мы получаем, во-первых, два разных нуля («обычный» 0 0 0 0 0 0 0 0 и «отрицательный» 1 0 0 0 0000), во-вторых, оси отрицательных и положительных чисел никак не стыкуются, и вы полнение арифметических операций превратится в головоломку. Поэтому поступим так: договоримся, что -1 соответствует число 255 ( 1 1 1 1 1 1 1 1 ) , -2 - числу 254 ( 1 1 1 1 1 1 1 0 ) и т. д. вниз до 1 28 ( 1 0 0 0 0 0 0 0 ) , которое будет соответст вовать -1 28 (и общий диапазон всех чисел получится от -1 28 до + 1 27) . Очевидно, что если вы в таком представлении хотите получить отрицательное число в обыч ном виде, то нужно из абсолютного значения числа в двоичной записи (например, оы1 1 1 0 0 0 0 = 240) вычесть максимальное значение диапазона ( оы1 1 1 1 1 1 1 = 255) и прибавить единицу (что равносильно вычитанию из 256) . Если отбросить знак, то результат такого вычитания ( оьо о о о 1 1 1 1 + 1 = оьо о о 1 0 0 0 0 = 1 6 в нашем случае) на зывается еще дополнением до 2-х (или просто дополнительным кодом) для исход ного числа (а само исходное число 240 тогда будет дополнением до 2-х для 1 6-ти). Название «дополнение до 2-х» не зависит от разрядности числа, потому что верх ней границей всегда служит степень двойки (в десятичной системе аналогичная операция называется «дополнение до 1 0») . Что произойдет в такой системе, если вычесть, например, 2 из 1 ? Запишем это дей ствие в двоичной системе обычным столбиком: 0 0 0 0 0 0 0 1 -0 0 0 0 0 0 1 0 В нулевом разряде результата мы без проблем получаем единицу, а уже для перво го нам придется занимать единицу из старших, которые сплошь нули, поэтому представим себе, что у нас будто бы есть девятый разряд, равный единице, из кото рого заем в конечном итоге и происх_одит: ( 1 ) 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==