Вы можете представить, что первый бит в числовом знаке будет - (2 x -1 ), где x - это количество бит.
Итак, учитывая 8-битное число, значение каждого бита (в порядке слева направо) равно:
-128 64 32 16 8 4 2 1
Теперь в двоичном формате 0 - это, очевидно, все 0:
-128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 0 = 0
И когда вы выполняете битовое не ~
, каждый из этих 0 становится 1:
-128 64 32 16 8 4 2 1
~0 1 1 1 1 1 1 1 1
= -128+64+32+16+8+4+2+1 == -1
Это также полезно для понимания переполнения:
-128 64 32 16 8 4 2 1
126 0 1 1 1 1 1 1 0 = 126
+1 0 1 1 1 1 1 1 1 = 127
+1 1 0 0 0 0 0 0 0 = -128 overflow!