Мое окружение разработки состоит из перекрестного компилятора g ++ для ARM OMAP Sitata. Я обнаружил необычный оттенок простой арифметики указателей, при добавлении неподписанных Int в беззнаковом Int *, следующим образом:добавление unsigned int в unsigned int *
unsigned int* dst_base_addr;
unsigned int* dst_addr;
unsigned int dst_offset;
Просто пытаюсь добавить (неподписанные Int) к (беззнаковый INT *)
dst_addr = dst_base_addr + dst_offset;
выше не интерпретируется как один может наивно думать, но на самом деле производит следующий эквивалентный результат
dst_addr = (unsigned int*)((unsigned int)dst_base_addr + (dst_offset << 2));
средство, конечно, сделать правильное преобразование типа, как следует
dst_addr = (unsigned int*)((unsigned int)dst_base_addr + dst_offset);
Вопрос: Почему в этой ситуации требуется надлежащее преобразование типов?
Во избежание ошибок. –
'dst_addr = dst_base_addr + dst_offset;' без выделения памяти для dst_addr не очень хорошо. –
'dst_addr = (unsigned int *) ((unsigned int) dst_base_addr + dst_offset); но это неправильно, арифметика указателя не работает так – SingerOfTheFall