Вот немного подробнее о том, почему это «просто работает», когда вы вычитаете «меньшее» из «большего».
Пара вещей, входящих в это ...
1. В аппаратном обеспечении вычитание использует сложение: соответствующий операнд просто отрицается перед добавлением.
2. В дополнении к двум (которое в значительной степени использует все) целое число сводится на нет, инвертируя все биты, затем добавляя 1.
Аппаратное обеспечение делает это более эффективно, чем кажется из приведенного выше описания, но это основной алгоритм вычитания (даже если значения не подписаны).
Итак, давайте рисунок 2 - 250, используя 8-битные целые числа без знака. В двоичном виде мы имеем
0 0 0 0 0 0 1 0
- 1 1 1 1 1 0 1 0
Мы отменяем вычитание операнда, а затем добавляем. Напомним, что для отрицания мы инвертируем все биты, а затем добавляем 1. После инвертирования битов второго операнда имеем
0 0 0 0 0 1 0 1
Тогда после добавления 1 имеем
0 0 0 0 0 1 1 0
Теперь мы выполняем сложение ...
0 0 0 0 0 0 1 0
+ 0 0 0 0 0 1 1 0
= 0 0 0 0 1 0 0 0 = 8, which is the result we wanted from 2 - 250