Побитовые операции над элементами из массива символов - PullRequest
0 голосов
/ 20 февраля 2020

Я создал массив шестнадцатеричных чисел, которые я хотел бы добавить поразрядно. В моей программе я хочу добавить 0xFF с 0x7F00. Вот мой подход

#include <iostream>

using namespace std;

int main() {

    char data[2] = {0xFF, 0x7F};

    cout << (data[0] | (data[1] << 8)) << endl;

    system("pause");
    return 0;
}

Я ожидаю, что результатом будет 0x7FFF, что составляет 32767 в десятичном виде, но я получаю -1 (0xFF в шестнадцатеричном).

1 Ответ

2 голосов
/ 20 февраля 2020

Проблема, с которой вы столкнулись, связана с двумя фактами:

  1. побитовые операторы требуют интегрального преобразования обоих операндов.
  2. char может быть как со знаком, так и без знака

Промоакция преобразует значения меньших типов (например, char или short) в int, и как часть этих значений со знаком будет знаковое расширение. Если char подписано, то значение 0xff будет преобразовано в (32-разрядное) int значение 0xffffffff, равное -1.

Не важно, какое значение Если вы используете в побитовом ИЛИ, результат все равно будет 0xffffffff.

. Простое решение - явно использовать unsigned char (или даже лучше uint8_t) в качестве типа для элементов массива:

uint8_t data[2] = {0xFF, 0x7F};
...