"дополнительном коде" (two's complemet). А те операции, что ты продемонстрировал выше на самом деле являются операциями смены знака. Выше можно было написать просто return -a; это то же самое. Я именно так изначально это и понял и чуть дополнил написанное.
> В обозначении "младшего разряда". Байт или бит? ;-)
В моём контексте выше - я подозревал что у тебя речь идет о битах. И я говорю о битах. Ок, далее просто уточню проговорив до полного понимания как меняется знак. Знак у чисел (т.е. группа бит, типично набор 8,16,32,64 бит но может быть любое количество) в дополнительном коде можно изменять так: сначала биты инвертируются. (Это можно выполнить как особой инструкцией процессора, так и выполнив XOR с набором бит которые все установлены в 1, т.к. это эквивалентно, либо как-то еще). Затем весь набор бит (не отдельный байт, не часть) необходимо беззнаково инкрементировать (или что то же самое, беззнаково добавить единицу). При этом должно быть предусмотрен заворот бит, т.е. 255 превратится в 0, 65535 превратится в 0 итд. На тех архитектурах где есть вычитание, операцию инверсии и инкремента можно заменить на вычитание из нуля. Результирующим набором бит будет такой, который если интерпретировать как "число со знаком в дополнительном коде" у него изменится знак. Примеры над байтом (октет 8 бит):
Было Инверсия бит Результат после INC Комментарий 0000 0000 → 1111 1111 → 0000 0000 У нуля знак не изменяется, ноль остается нулем 0000 0001 → 1111 1110 → 1111 1111 1 стала 255 т.е. -1
0000 0010 → 1111 1101 → 1111 1110 2 стала 254 или -2
1010 1010 → 0101 0101 → 1010110.b -86 (170) стало после инверсии бит 85, а затем 86