c - 需要帮助理解 C 中的左移运算符

标签 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);

它分别打印出pA和(*pA<<2),如果你把这两个相减,它不会等于表达式中写的r3,相差4倍,这就是大小的 int。但是你需要在哪里考虑 int 的大小,因为你同时有 pA 和 (*pA<<2),并且它们的减法不等于它应该的值。

感谢任何帮助...

郑重声明,我对打印出指针的实际值不感兴趣,但实际上它的地址被移动了 2 位。而且我不明白正在发生的确切过程。

最佳答案

指针上的算术随其指向的大小而变化。所以当你这样做 pA - 80你的代码实际上是 pA - 80*sizeof(*pA) 。这与<<无关.

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

关于c - 需要帮助理解 C 中的左移运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771294/

相关文章:

C/实时用不同类型的数据初始化内存

c - 关于C语言中指针函数的困惑

char * 和整数之间可以相互转换吗?

将数字转换为设置了 N 位的字节

c - 在检查正整数 N 是否为大 N 的 2 次幂时出现错误

c - C 中 intBitsTofloat 中丢弃的精度值

c - 在 C 中保存结构地址的变量的数据类型应该是什么?

c++ - 在 C/C++ 中使用堆栈进行内存管理时的编码风格

python - 大 numpy 数组中的重复位

javascript - 如何强制按位运算符产生无符号结果?