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)
问题:为什么在这种情况下甚至需要正确的类型转换?
上述内容并未被解释为人们可能会天真地想到,但实际上会产生以下等效结果
C中的指针算法(可能是C++)是以指向的东西的大小为单位完成的.如果将n添加到int*生成的代码中,将添加尽可能多的字节来表示n ints,即如果int是32位(大多数理智架构上为4个字节),则可能为4*n .
这是标准的C行为.
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |