Кажется, что вы путаете понятия дополнения и знака-бита 2, а также побитового или сложения в C.
(А кто бы мог ожидать 6 + (-5) ≠ 1…)
(1) 2-е дополнение и знак-бит
На большинстве архитектур отрицательные числа реализованы как дополнение 2 его величины. В то время как стандарт C не требует использования дополнения 2, он является самым популярным. В дополнении 2 отрицание x
строится как ~x + 1
, например
5 = 0000 0101
~5 = 1111 1010 # ~x means 1's complement, a.k.a. bitwise-NOT
~5+1 = 1111 1011 # +1 means add 1 to the integer.
Это двоичное представление -5. Старший бит целого числа называется знаковым битом , поскольку он определяет знак целого числа. Все отрицательные целые числа в дополнении 2 имеют знак бита = 1. Но простое переключение знака не отменяет число. Это всего лишь показатель того, что число отрицательное или нет.
(2) Побитовое или сложение в C
+
означает целочисленное сложение в C и во всех других практических языках, потому что целочисленное сложение гораздо полезнее, чем побитовое или. Поэтому, хотя в логических доказательствах ИЛИ широко записывается как +
, ни один язык программирования не распознает +
для побитового ИЛИ.
В C a char
- это просто целое число со знаком, длина которого ровно 1 байт. Поведение такое же, как и у всех других типов целых чисел со знаком. Вы должны использовать |
для побитового ИЛИ.
0000 0110 0000 0110
+ 1000 0101 | 1000 0101
——————————— ———————————
1000 1011 1000 0111
^^--- note the carry ---^^