将地址空间除以8

时间:2013-11-05 15:38:28

标签: c virtual-address-space address-space

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

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

我怎么知道它们是否可被8或8字节对齐整除?就像C或C ++代码中的支票一样。我知道你通常使用mod作为常规数字,如果没有余数,那么你就知道它是可分的。

编辑:地址空间可以是__8,__ 16,__ 32(8位,16位,32位)

4 个答案:

答案 0 :(得分:4)

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
}

另请参阅Determining the alignment of C/C++ structures in relation to its members了解对齐问题。

答案 1 :(得分:3)

余数运算符为%。所以只需测试

addr % 8 == 0

如果你有一个指针形式的地址,你需要将指针强制转换为适当的无符号整数类型。

答案 2 :(得分:2)

您可以使用按位&amp;运营商。您必须首先投射到uintptr_t

bool isAligned(const void *ptr) {
    return !(((uintptr_t)ptr) & 7);
}

答案 3 :(得分:1)

if (addr % 8 == 0)
{
    //divisible by 8
}
else
{
    //not divisible by 8
}