2017-02-17 2 views
-2

Мое окружение разработки состоит из перекрестного компилятора 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); 

Вопрос: Почему в этой ситуации требуется надлежащее преобразование типов?

+0

Во избежание ошибок. –

+0

'dst_addr = dst_base_addr + dst_offset;' без выделения памяти для dst_addr не очень хорошо. –

+0

'dst_addr = (unsigned int *) ((unsigned int) dst_base_addr + dst_offset); но это неправильно, арифметика указателя не работает так – SingerOfTheFall

ответ

7

выше не интерпретируется как один может наивно думать, но на самом деле производит следующий эквивалентный результат

арифметика указателей в C (и, предположительно, C++) производится в единицах размера вещи указывали на. Если вы добавите n к int*, генерируемый код добавит столько байтов, сколько потребуется для представления n int с i.e, возможно, 4 * n, если int - 32 бита (4 байта на большинстве правильных архитектур).

Это стандартное поведение С.

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