2014-04-08 33 views
-1

林在C.如何在C截斷地址

寫一個hexdump都函數我怎樣才能截斷一個給定的地址(void *的開始)到16的最大倍數使用小於給定的開始爭論? 有沒有簡單的方法來做到這一點? 感謝

+0

類似於(uintptr_t)start&〜0xfU'? – twalberg

+0

更少或更少或相等?你想要一個已經以四個零位結束的地址0x123F0? – usr2564301

回答

2
uintptr_t rounded = ((uintptr_t)start) & ~0xF; 
+0

最好的解決方案。 *嚴格地說*讀取OP的問題,你應該可能需要'(((uintptr_t)start) - 1)&〜0x0F'(啊 - 需要將'start'強制轉換爲字符類型,然後直接減1?) – usr2564301

+0

非常感謝! – user2817587

0

假設void *address包含您的原文地址:

unsigned long int multiple = (unsigned long int)address/16; 
void *new_address = (void*)(16 * multiple;) 

除以16會給你的積分值。

+2

@ user2817587,我建議你使用這個而不是'int'。改用unsigned long。地址總是無符號的,這種轉換很可能會導致錯誤的地址。在C++中,你可以使用size_t。 – DNT

+1

'int'可能太小而不能容納指針。 – Kevin

+0

@DNT:更新..忘了標誌..和大小是一個錯誤.. – brokenfoot

0
uintptr_t x = ((uintptr_t)addr) & ~((1 << 4) - 1); 

需要注意的是(從C99)一個uintptr_t的是無符號整數保證大到足以容納你的平臺上的指針。

位移位最低的4位(16的倍數)。