2

我的问题是关于处理地址空间。

我有两个十六进制地址空间:0x7ffffff09 和 0x7fffff08。

我怎么知道它们是否可以被 8 或 8 字节对齐整除?就像检查在 C 或 C++ 代码中的样子一样。我知道您通常将 mod 用于常规数字,如果没有余数,那么您就知道它是可整除的。

编辑:地址空间可以是__8、__16、__32(8位、16位、32位)

4

4 回答 4

7

8 字节对齐取决于架构。

8 字节整除只是模运算。将指针复制到足够大的 int 并执行 % 8。

#include <stdint.h>
void *addr = ....
uintptr_t i = (uintptr_t)addr;
i = i % 8

当然,你可以把它放在一个函数中:

int isEightByteDivisible(const void *addr) {
    return ((uintptr_t)addr % 8) == 0
}

另请参阅确定 C/C++ 结构相对于其成员的对齐方式,了解对齐问题。

于 2013-11-05T15:40:19.527 回答
3

余数运算符是%。所以简单测试

addr % 8 == 0

如果您有指针形式的地址,则需要将指针转换为适当的无符号整数类型。

于 2013-11-05T15:39:44.600 回答
2

您可以使用按位 & 运算符快速完成此操作。您必须首先转换为uintptr_t

bool isAligned(const void *ptr) {
    return !(((uintptr_t)ptr) & 7);
}
于 2013-11-05T15:48:19.197 回答
1
if (addr % 8 == 0)
{
    //divisible by 8
}
else
{
    //not divisible by 8
}
于 2013-11-05T15:50:14.017 回答