我在理解左移运算符时遇到一些问题。我知道如果向左移动 x 个位数,那么几乎可以将该数字乘以 2 的移位位数次方。
但考虑一下这个程序:
int a=4,*pA=&a,r3;
printf("%d\n",pA);
printf("%d\n",(*pA<<2));
r3=pA-(*pA<<2);
printf("%d",r3);
它分别打印出pA和(*pA<<2),如果你把这两个相减,它不会等于表达式中写的r3,相差4倍,这就是大小的 int。但是你需要在哪里考虑 int 的大小,因为你同时有 pA 和 (*pA<<2),并且它们的减法不等于它应该的值。
感谢任何帮助...
郑重声明,我对打印出指针的实际值不感兴趣,但实际上它的地址被移动了 2 位。而且我不明白正在发生的确切过程。
最佳答案
指针上的算术随其指向的大小而变化。所以当你这样做 pA - 80
你的代码实际上是 pA - 80*sizeof(*pA)
。这与<<
无关.
您还应该使用 %p
打印地址格式说明符。要将指针值存储在整数类型中,请使用 intptr_t
或uintptr_t
(来自stdint.h
)。在编译器上启用警告,如果您不这样做,它应该会提示。
关于c - 需要帮助理解 C 中的左移运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771294/