Лучше вычитать в обратном коде, через сложение. Или вычитать меньшее из большего.
Но если вам так хочется, то можно вычитать, пока не кончатся разряды.
00000100
-
00000111
=
*1111101
Но вот проблема, в последнем разряде (где у меня стоит *) на самом деле должна быть -1. просто больше не откуда заимствовать.
Если же мы сделаем это заимствование, то получим X=11111101 и -1 в следующем, не существующем разряде.
Это фактически и есть уже число в обратном коде! Если взять битовое НЕ и прибавить 1, то мы получим 0011 = 3, как и должны были. Ведь само число - -3.
Но почему так получается? Ваше число на самом деле X - 2^8 (потому что 1 стоит в следующем, не существующем разряде).
Или - (2^8-X). Побитовое НЕ. это просто вычитание из 111...111. Т.е. ~X=(2^8-1) -X.
Остюда 2^8-X = ~X+1.
Т.е. ваше число на самом деле ~X+1 по модулю.