【发布时间】:2023-03-25 13:13:01
【问题描述】:
对于我正在处理的程序,我需要将地址四舍五入到最近的 8 字节边界之外的 4 字节。也就是说,地址必须以这样的方式修改,即它们以 0x4 或 0xC 结尾并且大于或等于它们的当前值。每个地址都是一个 64 位整数,指向内存中的一个字节 (sizeof(*addr) = 1)。地址保证是无符号的。
我知道可以使用以下代码 sn-p 找到最接近的 8 字节边界,简单的答案是简单地将 0x4 添加到该值,但是,这会导致一些高估该值的问题。
#define align_8(addr) (((addr) + 7) & (~7))
例如,假设我们有地址0x500B。我希望它对齐的值是0x500C,但是如果我们对齐到最近的 8 字节边界 (0x5010),然后添加 0x4,我们将以 0x5014 结尾。这会跳过我不想被跳过的 8 个字节。
我希望能够使用类似于我在此处提供的 8 字节对齐宏的简单宏来执行此操作。任何帮助将不胜感激,谢谢!
【问题讨论】:
-
while (addr %8 != 4) addr++;有效。其他想法可以避免循环。 -
@chux 谢谢,我暂时用这个。
-
提示:注意失败的解决方案
addr < 4。 -
@chux 可能会在算术之前转换为
uintptr_t。sizeof(*addr)可能不是 1 -
@AjayBrahmakshatriya 好点。 OP 没有说明
addr的类型,除了隐含在let's say we have the address 0x500B之类的东西中,所以addr似乎已经被整数化了。
标签: c bit-manipulation