переполнение во время работы a + (- a)

Asumming a = 1

1 + (- 1) = 0

но с 4-битным двоичным, используя 2-х дополнения

0001 + 1111 = 10000 ~ 0000

Не является ли целочисленное переполнение со знаком неопределенным поведением?

Зависим ли мы от неопределенного поведения для такого тривиального результата, или я что-то упускаю.

из википедии:
Если оставшиеся два бита переноса (те, которые находятся в крайнем левом углу верхней строки в этих примерах) равны 1 или оба 0, результат верен; если оставленные два бита переноса равны «1 0» или «0 1», произошло переполнение знака.

2

Решение

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

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

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

3

Другие решения

Целочисленное переполнение со знаком является undefined, но я не вижу, как это могло бы быть проблемой здесь, так как вы добавляете два числа со знаком, и результат действительно попадает в диапазон.

Для 4-битного целочисленного типа переполнение будет прибавлять 7 + 7, где результат должен быть 14, который не укладывается в диапазон -2 ^ 3..2 ^ 3-1

2

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

0

Это неопределенное поведение, но я не уверен, что понимаю ваш вопрос. Вы спрашиваете, почему это работает в этом примере? Потому что эти значения находятся в пределах диапазона, а результат находится в диапазоне. Рассматривать

-8 + -1

В 4 бит

1000 + 1111 -> 10111 -> 0111 -> 7. Здесь у нас больше нет правильного ответа

-1
По вопросам рекламы [email protected]