2013-11-22 62 views
0

目前我正在試圖破譯別人的代碼,我也遇到過這樣的事情的:未知用途的指針操作

byte* d = new byte[n]; // Value of 'n' is determined at runtime. 
byte* w1 = d + offset; // Value of 'offset' is constant and even. 
... 
for(int i = 0; i < imageCount; ++i){ 
    w1 += d - w1 & 7; // At this point, 'd' didnt change, and w1 > d. 
    ... 
} 

我不明白在循環指令不執行,這是使用。
指針'w1'用於以偏移量將數據寫入'd'。
然後他使用'd'寫入磁盤。

回答

3

這會將w1到下一個8字節邊界相對於d開始時,原地踏步,如果w1已經是邊界上。

w1 - d返回當前偏移量爲d。因此d - w1提供了否定的。

安定與7爲您提供了一個數字0。7

那麼,如何補充說,到W1 W1移動到下一個8字節邊界?假設d是1000.讓我們看看w1的值爲1001到1008時會發生什麼。我將添加括號以使其更清晰。

(1000 - 1001) = -1; (-1) & 7 = 7;  
(1000 - 1002) = -2; (-2) & 7 = 6; 
(1000 - 1003) = -3; (-3) & 7 = 5; 
.... ok, this is getting tedious .... 
(1000 - 1008) = -8; (-8) & 7 = 0; 

現在你會發現,如果通過1016如果你重複這個練習與1009添加這些終端上1008的所有8個生產到w1起始值的價值,你會看到相同的事情發生在那裏,四捨五入他們全部達到1016.

請注意,這是非常具體的ptrdiff_t是2s補碼(它幾乎每一個現代系統,它是)。

+0

我在想這會是這樣的,但你能向我解釋這到底是怎麼回事嗎? – gdube

+0

將其與相對於d的下一個8字節邊界對齊。例如,如果d是0x00000001,w1是0x00000002,它將對齊到0x00000009,而不是0x00000008 –

+0

我剛剛添加了上面的解釋。 –