首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从普通指针中减去NULL指针会产生算术右移

从普通指针中减去NULL指针会产生算术右移
EN

Stack Overflow用户
提问于 2019-04-09 22:23:40
回答 1查看 128关注 0票数 6

这是C代码。

代码语言:javascript
复制
int main() {
  int i = 10, *p = &i;
  printf("%ld", p - (int *) NULL);
}

对于指针算术部分,'gcc‘和'clang’都会在其汇编输出中生成'sar rax,2‘指令。有人能解释一下这种情况下指针算术和算术右移有什么关系吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-09 22:28:27

右移2是除以4的快速方法。4是你的int大小。

两个指针到int的距离是对应于int指针的两个char指针的距离除以int大小(请记住,将整数添加到指针时,整数将按指针目标大小进行缩放,因此在进行差分时,需要撤消此缩放)。

从技术上讲,你不应该减去两个不相关的指针(或者用"%ld"而不是正确的"%zd"来打印差异),因为这是未定义的行为-标准只允许你比较指向同一对象或刚刚超过它的指针。然而,一个本身没有这种未定义行为的通用int*-diffing函数:

代码语言:javascript
复制
#include <stddef.h>

ptrdiff_t diff_int_ptr(int *A, int *B)
{
    return A-B;
}

仍将转换为与

代码语言:javascript
复制
ptrdiff_t diff_int_ptr(int *A, int *B)
{
    return ((char*)A - (char*)B) >> lg2(sizeof(int));
    //strength reduced from: return ((char*)A - (char*)B) / sizeof(int)
    //which is possible iff sizeof(int) is a power of 2
}

在优化编译器(godbold link for x86-64 gcc and clang)上,移位通常比现代机器上的除法快10倍以上。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55595107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档