@Helga_096

Вычитание в прямом коде?

Здравствуйте! Столкнулся с проблемой.
Есть число 4 -> 0100 (в прямом коде)
Есть число 7 -> 0111 (в прямом коде)
Когда я пытаюсь получить разность 4 - 7, то в результате получаю 0X11, где X - какое - то значение, которое я не могу получить, т.к "занять" 1 из след.разряда я не могу. Как решить эту проблему?
  • Вопрос задан
  • 243 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Лучше вычитать в обратном коде, через сложение. Или вычитать меньшее из большего.

Но если вам так хочется, то можно вычитать, пока не кончатся разряды.

00000100
-
00000111
=
*1111101

Но вот проблема, в последнем разряде (где у меня стоит *) на самом деле должна быть -1. просто больше не откуда заимствовать.

Если же мы сделаем это заимствование, то получим X=11111101 и -1 в следующем, не существующем разряде.

Это фактически и есть уже число в обратном коде! Если взять битовое НЕ и прибавить 1, то мы получим 0011 = 3, как и должны были. Ведь само число - -3.

Но почему так получается? Ваше число на самом деле X - 2^8 (потому что 1 стоит в следующем, не существующем разряде).
Или - (2^8-X). Побитовое НЕ. это просто вычитание из 111...111. Т.е. ~X=(2^8-1) -X.

Остюда 2^8-X = ~X+1.

Т.е. ваше число на самом деле ~X+1 по модулю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы