Проблема, с которой вы столкнулись, связана с двумя фактами:
- побитовые операторы требуют интегрального преобразования обоих операндов.
char
может быть как со знаком, так и без знака
Промоакция преобразует значения меньших типов (например, char
или short
) в int
, и как часть этих значений со знаком будет знаковое расширение. Если char
подписано, то значение 0xff
будет преобразовано в (32-разрядное) int
значение 0xffffffff
, равное -1
.
Не важно, какое значение Если вы используете в побитовом ИЛИ, результат все равно будет 0xffffffff
.
. Простое решение - явно использовать unsigned char
(или даже лучше uint8_t
) в качестве типа для элементов массива:
uint8_t data[2] = {0xFF, 0x7F};