【发布时间】:2021-03-07 05:02:44
【问题描述】:
我想通过将指针地址截断 1 个字节来节省一些空间。我的指针保证是 16 字节内存对齐的。因此,我可以保证这 4 个低位可以被截断。
typedef struct node_t {
uintptr_t prev : 29;
uintptr_t next : 29;
} node;
我正在努力恢复那些最底层的字节。向左位移 4 位以尝试恢复最底部位中的零只会擦除最前面字节中的数据。
node->next = ((uintptr_t) ptr_addrs >> 4); // successfully stores truncated pointer ex: 0x1024ff010
printf("%p\n", node->next); // prints '0x1024ff01'
如何将位域转换回其原始值(基本上是在该位域上附加一个零)?
【问题讨论】:
-
你有没有检查过这是否真的对
sizeof(node)有任何影响? -
是的;在我的系统上,如果我要使用完整字段,我会得到 sizeof(node) = 16,而使用 bitfields 有 sizeof(node) = 8
-
所以你正在编译 64 位?
-
是的;在 Linux 64 位机器上;使用 gcc 编译
-
@RetiredNinja:老实说,我已经遇到了从哪里开始的问题,这一切都错了。这就是为什么我试图将他指向研究的主题。
标签: c pointers bit-fields