我的问题是处理地址空间。
我有两个十六进制的地址空间:0x7fffff09和0x7fffff08。
我怎么知道它们是否可被8或8字节对齐整除?就像C或C ++代码中的支票一样。我知道你通常使用mod作为常规数字,如果没有余数,那么你就知道它是可分的。
编辑:地址空间可以是__8,__ 16,__ 32(8位,16位,32位)
答案 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
}