需要帮助理解C中的左移操作符

-1 c bit-manipulation

我有一些理解左移操作符的问题.我知道如果向左移位x位数,那么将数字乘以2几位乘以移位的位数.

但考虑一下这个程序:

int a=4,*pA=&a,r3;
printf("%d\n",pA);
printf("%d\n",(*pA<<2));
r3=pA-(*pA<<2);
printf("%d",r3);
Run Code Online (Sandbox Code Playgroud)

它分别打印出pA和(*pA << 2),如果要减去这两个,它将不等于表达式中写入的r3,关闭4次,即int的大小.但是你需要考虑int的大小,因为你有pA和(*pA << 2),并且它们的减法不等于它的预期.

任何帮助表示赞赏......

为了记录,我对打印出指针的实际值不感兴趣,但实际上它的地址被移位了2位.我不明白正在发生的过程.

Kev*_*vin 5

指针上的算术与其指向的大小成比例.所以当你做pA - 80你的代码实际上pA - 80*sizeof(*pA).这与此无关<<.

您还应该使用%p格式说明符打印地址.并将指针值存储在整数类型中使用intptr_tuintptr_t(从stdint.h).在编译器上启用警告,如果不这样做,它应该抱怨.