2015-10-29 4 views
0

У меня возникли проблемы с конкатенацией двух шестнадцатеричных значений в C++;Согласование шестнадцатеричных значений в C++

int virtAddr = (machine->mainMemory[ptrPhysicalAddr + 1] << 8) | (machine->mainMemory[ptrPhysicalAddr]); 
int physAddr = currentThread->space->GetPhysicalAddress(virtAddr); 

Для machine->mainMemory[ptrPhysicalAddr + 1], это дает 0x5. Для machine->mainMemory[ptrPhysicalAddr] это дает 0x84. Я ожидаю результат 0x584. Тем не менее, я получаю 0xffffff84. Я следовал этому вопросу Concatenate hex numbers in C.

+1

size_t и ptrdiff_t являются типы, которые вы хотите –

+1

Какой тип 'mainMemory'? –

+0

@AlanStokes это массив символов – mrQWERTY

ответ

3

0x84 is -124. Он расширяется до (int)-124 перед операцией поразрядного ИЛИ (цельное продвижение). И результат - 0x00000500 | 0xFFFFFF84. Используйте неподписанный тип, чтобы предотвратить расширение знака при расширении.

intptr_t virtAddr = (uint8_t(machine->mainMemory[ptrPhysicalAddr + 1]) << 8) 
        | uint8_t(machine->mainMemory[ptrPhysicalAddr]); 
+0

Это вдохновленное предположение о типе 'machine-> mainMemory'? – Roddy

+0

@ Roddy: Не угадайте столько, сколько вычитание основано на доказательствах. –

Смежные вопросы