Это происходит из-за представления двух дополнений отрицательных чисел.Дополнение к двум выполняется путем инвертирования всех битов, а затем добавления одного.
Сначала у вас есть a|b
(для простоты я покажу только младшие 8 бит):
a 00000101 5
| b 00001000 8
------------
00001101 13
Тогда побитовое НЕ:
~ 00001101 13
----------
11110010 -14
Выполнение побитового НЕ для положительного значения не дает вам его отрицательного значения, оно дает вам на меньше .