将unsigned int添加到unsigned int*

usy*_*inc -2 c c++ pointer-arithmetic unsigned-integer

我的开发环境包含用于ARM OMAP Sitata的g ++交叉编译器.当向unsigned int*添加unsigned int时,我发现了一个简单的指针算法的不寻常的细微差别,如下所示:

unsigned int* dst_base_addr;
unsigned int* dst_addr; 
unsigned int dst_offset;
Run Code Online (Sandbox Code Playgroud)

只是尝试将(unsigned int)添加到(unsigned int*)

dst_addr = dst_base_addr + dst_offset;
Run Code Online (Sandbox Code Playgroud)

上述内容并未被解释为人们可能会天真地想到,但实际上会产生以下等效结果

dst_addr = (unsigned int*)((unsigned int)dst_base_addr + (dst_offset << 2));
Run Code Online (Sandbox Code Playgroud)

补救当然是按照以下方式进行适当的类型转换

dst_addr = (unsigned int*)((unsigned int)dst_base_addr + dst_offset);
Run Code Online (Sandbox Code Playgroud)

问题:为什么在这种情况下甚至需要正确的类型转换?

Jer*_*myP 7

上述内容并未被解释为人们可能会天真地想到,但实际上会产生以下等效结果

C中的指针算法(可能是C++)是以指向的东西的大小为单位完成的.如果将n添加到int*生成的代码中,将添加尽可能多的字节来表示n ints,即如果int是32位(大多数理智架构上为4个字节),则可能为4*n .

这是标准的C行为.