Ожидаемый двоичный результат с дополнением до 2

Я готовлюсь к экзамену и хочу проверить свои ответы на этот вопрос:

Предположим, двоичные значения представляют собой 8-битные значения со знаком, представляющие формат с дополнением до двух с десятичным диапазоном от -128 до 127. Какие из следующих утверждений верны / неверны?

1) 11111111 > 0111111

Я думаю, что это неверно, потому что первая цифра представляет знак, поэтому мы сравниваем отрицательное значение с положительным.

2) (11111111 + 11111111) > (00000001 - 00000010)

Я не уверен насчет этого, потому что не знаю, что происходит, когда он переполняется. Думаю, компьютер просто отбрасывает последнюю цифру. Итак, я думаю, что левая часть равна -128 - 128 = -256. Тогда правая часть равна 1-2 = -1, что представляется как 1000001. Это означает, что неравенство в десятичной дроби становится -256> -1, что неверно. Но опять же, я не так уверен в этом.

3) (10000000 / 00000100) == 11100000

Первая часть равна -0/4, а вторая ненулевая, так что это будет ложью?


Кроме того, есть только примеры задач, и я хотел бы попрактиковаться / изучить самостоятельно. Есть ли способ написать программу на C ++, чтобы увидеть ожидаемый результат вопросов этой формы?

Спасибо.


person oompa    schedule 26.09.2019    source источник
comment
Вы основываете все свои рассуждения на дополнении одного, а не дополнения двух. Битовый шаблон 11111111 представляет -1 в дополнении до двух, а не -127 (или -128, но он не представляет -128 ни в одной системе, о которой я могу думать). Точно так же битовая комбинация 10000000 представляет -128, а не -0. Не существует -0 в двух дополнениях.   -  person Miles Budnek    schedule 26.09.2019
comment
Итак, будет ли это рассуждение правильным для третьего: LHS -128 / 4, а RHS -32, так что это правда   -  person oompa    schedule 26.09.2019
comment
Это правильно.   -  person Miles Budnek    schedule 26.09.2019
comment
А для второго тогда нет проблем с переполнением, верно? Или есть? Я думаю, что LHS (-1 + -1) в десятичном виде, а RHS -1, поэтому ответ неверен   -  person oompa    schedule 26.09.2019


Ответы (1)


Что касается экспериментов с этим в C ++, существует множество библиотек битовых манипуляций (простой поиск "библиотеки битовых манипуляций C ++" даст много результатов). Вот несколько примеров:

  1. https://github.com/Chris--A/BitBool
  2. https://www.slac.stanford.edu/comp/unix/gnu-info/libg++_23.html

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

person Aaron Altman    schedule 26.09.2019