Ваша ошибка в предположении, что, поскольку 3 равно 00000011
, -3 представляется просто инвертированием битов (так называемое представление отрицательного числа «одно дополнение») для получения 11111100
. И это также 00000001
становится 11111110
при отрицании. На самом деле это не так - вместо этого ваш компьютер, похоже, использует почти универсальную систему «два дополнения» , в которой -3 представляется как 11111101
, -2 - 11111110
, а -1 - 11111111
.
Один хороший интуитивный насос для системы с двумя дополнениями состоит в том, чтобы рассмотреть последовательность приращений и отметить, что поведение несколько непротиворечиво и интуитивно понятно, независимо от того, представляете ли вы их в самом битовом шаблоне, в подписанном представлении, или в неподписанном. Для простоты давайте придерживаться 8 бит (представьте, что «9-й бит» просто отбрасывается):
bit pattern interpreted as...
signed byte unsigned byte
11111101 -3 253
11111110 -2 254
11111111 -1 255
00000000 0 0 (wrap-around)
00000001 1 1
Когда он изменяется от -1 до 0, я почти "слышу", как все эти биты переворачиваются один за другим.