我的开发环境由 ARM OMAP Sitata 的 g++ 交叉编译器组成。当将一个无符号 int 添加到一个无符号 int* 时,我发现了简单指针算术的一个不寻常的细微差别,如下所示:
unsigned int* dst_base_addr;
unsigned int* dst_addr;
unsigned int dst_offset;
简单地尝试将 (unsigned int) 添加到 (unsigned 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);
问题:为什么在这种情况下还需要正确的类型转换?
最佳答案
The above is not interpreted as one might naively think but actually produces the following equivalent result
C(大概还有 C++)中的指针算术是以所指向事物的大小为单位来完成的。如果将 n 添加到 int*
中,生成的代码将添加表示 n int
所需的尽可能多的字节,即如果 int
则可能为 4 * n code> 是 32 位(在大多数正常架构上为 4 字节)。
这是标准的 C 行为。
关于c++ - 将 unsigned int 添加到 unsigned int*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42300621/