對於我正在處理的程序,我需要將地址四捨五入爲距離最近的8字節邊界4個字節。也就是說,必須修改地址,使其以0x4或0xC結尾,並且大於或等於其當前值。每個地址是一個64位整數,指向內存中的單個字節(sizeof(*addr) = 1
)。地址保證是無符號的。對齊地址從一個8字節的邊界4個字節
我知道最接近的8字節邊界可以通過下面的代碼片段找到,簡單的答案是簡單地將0x4加到該值,但是這會導致一些高估該值的問題。
#define align_8(addr) (((addr) + 7) & (~7))
例如,假設我們有地址0x500B
。我希望這個對齊的值是0x500C
,但是如果我們對齊到最近的8字節邊界(0x5010
)然後加上0x4,我們以0x5014
結束。這跳過了我不想跳過的8個字節。
我想用一個類似於我在這裏提供的8字節對齊宏的簡單宏來做到這一點。任何幫助將不勝感激,謝謝!
'while(addr%8!= 4)addr ++;'works。其他想法可以避免循環。 – chux
@chux謝謝,我會暫時使用它。 – beeselmane
提示:注意失敗了'addr <4'的解決方案。 – chux