Qt Creator + GDB + MingW - Побит И вопрос - PullRequest
0 голосов
/ 15 января 2019

Я пытался оценить, как поразрядно И результаты операции оцениваются. Я использую Qt Creator + GDB + MingW в Windows.

Я сделал простой тест:

#define BITMASK_CAN_JUMP 1 << 0 // 0x0001
#define BITMASK_CAN_WALK 1 << 1 // 0x0010

unsigned int data = BITMASK_CAN_JUMP | BITMASK_CAN_WALK;
...
    if (data & BITMASK_CAN_WALK) {
        printf("%d", data & BITMASK_CAN_WALK);
        printf("can walk\n");
    }
...

Установка часов в GDB для (data & 0x0010) дает мне значение 0, потому что 0x0010 = 0b10000, что правильно. Условие if оценивается как true, потому что значение оценивается как 2. Мне кажется, что отладчик действует правильно, обрабатывая 0x0010 как шестнадцатеричное значение, в то время как сама программа получает какое-то неявное преобразование, такое как преобразование значения за данными в шестнадцатеричное значение. Я не понимаю, почему данные не преобразуются в шестнадцатеричное значение, а также при использовании GDB. Может ли кто-нибудь прояснить мне ситуацию?

Лучший Том

1 Ответ

0 голосов
/ 15 января 2019

Это правильные значения определений:

#define BITMASK_CAN_JUMP 1 << 0 // 0b0001
#define BITMASK_CAN_WALK 1 << 1 // 0b0010

Возможно, вы по крайней мере захотите поставить скобки вокруг 1 << 0 и 1 << 1, но это уже другая история.В любом случае, data становится 0b10 | 0b01, что составляет 0b11 или 3 в десятичном виде.

(data & BITMASK_CAN_WALK) равно 0b11 & 0b10, что составляет 0b10 или 2 в десятичном виде.

Следовательно, if (data & BITMASK_CAN_WALK) берется, потому что это не 0 (в C ++ оно будет неявно приведено к true), и оно печатает вышеупомянутый 2.Если вы измените спецификатор формата на #010x, вы увидите, что это действительно 0x2.

Ничто здесь не имеет значения 0x0010 (16 в десятичном виде), возможно, есть ошибка отображения, есливы видите это значение.

...