Asumming a = 1
1 + (- 1) = 0
но с 4-битным двоичным, используя 2-х дополнения
0001 + 1111 = 10000 ~ 0000
Не является ли целочисленное переполнение со знаком неопределенным поведением?
Зависим ли мы от неопределенного поведения для такого тривиального результата, или я что-то упускаю.
из википедии:
Если оставшиеся два бита переноса (те, которые находятся в крайнем левом углу верхней строки в этих примерах) равны 1 или оба 0, результат верен; если оставленные два бита переноса равны «1 0» или «0 1», произошло переполнение знака.
Добавление чисел со знаком с противоположными знаками никогда не приводит к переполнению. Действительно, аппаратное обеспечение обычно имеет два флаговых бита, связанных с добавлением, то есть бит переполнения и бит переноса.
Бит переполнения устанавливается только в том случае, если контейнер недостаточно велик для правильного представления числа. Для числа со знаком оборудование устанавливает этот бит после анализа знакового бита каждого операнда и знака результатов. Если знаки операндов различны, этот бит никогда не будет установлен. В противном случае, если сигналы операндов равны, он анализирует знак результата. Если он отличается от операндов, он устанавливает этот флаг, указывая, что результат находится в переполнении.
В вашем примере знак каждого операнда различен, поэтому переполнения нет, но эта операция генерирует бит переноса, если вы хотите использовать большой контейнер для правильной работы операции.
Целочисленное переполнение со знаком является undefined, но я не вижу, как это могло бы быть проблемой здесь, так как вы добавляете два числа со знаком, и результат действительно попадает в диапазон.
Для 4-битного целочисленного типа переполнение будет прибавлять 7 + 7, где результат должен быть 14, который не укладывается в диапазон -2 ^ 3..2 ^ 3-1
Базовое представление может внутренне использовать переполнение для получения правильного результата, но это не имеет значения. Поведение не определено, только если результат операции превышает диапазон типа.
Это неопределенное поведение, но я не уверен, что понимаю ваш вопрос. Вы спрашиваете, почему это работает в этом примере? Потому что эти значения находятся в пределах диапазона, а результат находится в диапазоне. Рассматривать
-8 + -1
В 4 бит
1000 + 1111 -> 10111 -> 0111 -> 7. Здесь у нас больше нет правильного ответа