2013-11-22 38 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

我刚刚添加了上面的解释。 –