对在C ++中使用ptrdiff_t感到困惑

时间:2013-01-13 20:32:33

标签: java c++ porting

我需要用Java翻译这行代码 不知道如何处理ptrdiff_t。不知道它在这里做了什么。顺便说一句,mask_block 是size_t类型。

size_t lowest_bit = mask_block & (-(ptrdiff_t)mask_block);

由于

3 个答案:

答案 0 :(得分:5)

小心!这有点神奇!

( x & ~(x-1) )返回表达式中的最低设置位。原始代码的作者决定使用( x & (-x) ),由于整数的two's comlement表示,它实际上是相同的。但是(原作者认为)要获得-x,您需要使用签名类型,并且如前所述,ptrdiff_t已签名,size_t未签名。

由于Java没有未签名类型,mask_block将为intmask_block & (-mask_block)可以正常运行。

请注意,由于有符号和无符号类型之间的互操作性,在C ++中,强制转换也是多余的。

答案 1 :(得分:4)

ptrdiff_t是应该用于两个指针之间(整数)差异的类型。也就是说,从另一个指针中减去一个指针的结果。它是一个有符号整数,应该足够大,可以大小最大可能的数组(所以在Java中,这只是一个int,我猜)

答案 2 :(得分:1)

x & -x有点破解,清除x除最低位之外的所有位。

对于x的所有非零值,它是1 << lb,其中lb是最低有效位的位置(从0开始计数)。

为什么要投放到ptrdiff_t?没有进一步的了解,很难说。我甚至不确定演员是否需要。 ptrdiff_t保证是有符号整数类型,size_t始终是无符号整数类型。所以,我想C ++代码的作者想要确保它是有符号的,并且与指针的大小相同。只需忽略转换就可以将代码移植到Java,就像在Java中所有整数都被签名一样。

生成的代码也比原始的C / C ++版本更具可移植性,原始的C / C ++版本假设机器使用2's complement来表示整数,尽管它(至少在理论上)不受C或C ++的保证。标准。但是,在Java中,保证JVM必须使用2的补码。