gpt4 book ai didi

c - 对齐地址偏离 8 字节边界 4 个字节

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:20 25 4
gpt4 key购买 nike

对于我正在处理的程序,我需要将地址四舍五入为距最近的 8 字节边界 4 字节。也就是说,必须修改地址,使其以 0x4 或 0xC 结尾,并且大于或等于它们的当前值。每个地址都是一个 64 位整数,指向内存中的单个字节 (sizeof(*addr) = 1)。地址保证是未签名的。

我知道可以使用以下代码片段找到最接近的 8 字节边界,简单的答案是简单地将 0x4 添加到该值,但是,这会导致一些高估该值的问题。

#define align_8(addr) (((addr) + 7) & (~7))

例如,假设我们有地址 0x500B。我希望它对齐的值是 0x500C,但是如果我们对齐到最近的 8 字节边界 (0x5010) 然后添加 0x4,我们以 0x5014。这会跳过我不希望被跳过的 8 个字节。

我希望能够使用类似于我在此处提供的 8 字节对齐宏的简单宏来执行此操作。任何帮助将不胜感激,谢谢!

最佳答案

有时它有助于回头看问题。

   A    B  C    D    E    F
5003 5004 +1 4FFE 4FF8 5004
5004 5004 +0 4FFF 4FF8 5004
5005 500C +7 5000 5000 500C
5006 500C +6 5001 5000 500C
5007 500C +5 5002 5000 500C
5008 500C +4 5003 5000 500C
5009 500C +3 5004 5000 500C
500A 500C +2 5005 5000 500C
500B 500C +1 5006 5000 500C
500C 500C +0 5007 5000 500C
500D 5014 +7 5008 5008 5014
500E 5014 +6 5009 5008 5014

观察:

(A) What you have
(B) What you want
(c) Distance A to B

构建算法以适当添加 0...7:

(D) Subtract 5 from (A)
(E) And (D) with 0xFFFFFFFFFFFFFFF8 to get rid of the 3 LSBs
(F) Add decimal 12 to (E)

由于 (F) = (B),目标是通过这些操作实现的:

((Addr - 5) & 0xFFFFFFFFFFFFFFF8) + 12

关于c - 对齐地址偏离 8 字节边界 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com