Я читал о том, почему следующий код глючит:
int tadd_ok ( int x, int y ) {
int sum = x + y;
return ( sum - x == y ) && ( sum - y == x );
}
Объяснение заключалось в том, что сложение дополнения до двух образует абелеву группу, поэтому выражение(x + y) - x
оценивается как y
независимо от того, переполняется ли сложение.
(То же самое для (x + y) - y)
, которое будет оцениваться как x
).
Я не понимаю это объяснение или ссылку на абелеву группу. Сложение с дополнением до двух в основном является беззнаковой арифметикой по модулю, которая «преобразуется» в дополнение до двух, верно?
Так, например, если у нас есть 4 бита, мы имеем диапазон [-8, 7].
В примере, если бы у нас было x = 7
и y = 6
результат переполняется до 6. И это не равно ни y
, ни x
.
Так почему же объяснение, что равенство всегда справедливо независимо от переполнения?
int
) переполнение вызывает неопределенное поведение. - person ouah   schedule 22.09.2014...Two's complement addition is basically unsigned modulo arithmetic that is "converted" to two's complement, right?
- person Cratylus   schedule 22.09.2014(x + y) - x
оценкуx
. - person ouah   schedule 22.09.2014