我的问题是关于处理地址空间。
我有两个十六进制地址空间:0x7ffffff09 和 0x7fffff08。
我怎么知道它们是否可以被 8 或 8 字节对齐整除?就像检查在 C 或 C++ 代码中的样子一样。我知道您通常将 mod 用于常规数字,如果没有余数,那么您就知道它是可整除的。
编辑:地址空间可以是__8、__16、__32(8位、16位、32位)
我的问题是关于处理地址空间。
我有两个十六进制地址空间:0x7ffffff09 和 0x7fffff08。
我怎么知道它们是否可以被 8 或 8 字节对齐整除?就像检查在 C 或 C++ 代码中的样子一样。我知道您通常将 mod 用于常规数字,如果没有余数,那么您就知道它是可整除的。
编辑:地址空间可以是__8、__16、__32(8位、16位、32位)
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++ 结构相对于其成员的对齐方式,了解对齐问题。
余数运算符是%
。所以简单测试
addr % 8 == 0
如果您有指针形式的地址,则需要将指针转换为适当的无符号整数类型。
您可以使用按位 & 运算符快速完成此操作。您必须首先转换为uintptr_t
:
bool isAligned(const void *ptr) {
return !(((uintptr_t)ptr) & 7);
}
if (addr % 8 == 0)
{
//divisible by 8
}
else
{
//not divisible by 8
}