【发布时间】:2010-12-23 03:29:03
【问题描述】:
我正在进行这个 C 项目,我希望提高内存效率。在某些情况下,我使用我编写的动态数组结构的 void *s 来保存位。我希望使用所有 64(在这种情况下)位。
我很快意识到你实际上不能对指针进行任何位操作。所以我的解决方案如下:
void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;
这可以完成工作,但这只是因为在我的计算机上,长整数和指针的大小相等。在所有(或大多数)架构中都会出现这种情况吗?
我真正的问题是:是否有更正确的方法来对指针进行位操作?我曾认为这种方法在 C 中有些常见(将位打包到 void * 中),但是我可能弄错了……
【问题讨论】:
-
我会使用 uint64_t 代替 stdint.h
-
如果您的平台的指针少于 64 位,uint64_t 会太大。使用同一标头中的 intptr_t 和 uintptr_t。
-
@sambory - 看起来你需要通过
stdint.h再靠近一点。 -
如果您希望将其用作 64 位位域,那么为 32 位平台编译将破坏任何内容,无论您将其转换为什么。正如我在下面的回答中提到的,您想声明指针与您需要的任何大小的位域的联合,因此无论您针对什么平台,该字段的大小都是正确的。
-
为什么首先需要这样的指针操作?它们唯一合法的用途是用于对齐目的,并且具有不需要从整数转换为整数的变通方法。
标签: c pointers bitwise-operators