21

我读到您不能对指针进行位掩码,为什么不能对指针进行按位运算?

有什么方法可以达到同样的效果吗?

这同样适用于 C++ 吗?

4

3 回答 3

24

您不能执行按位指针操作的原因是因为标准说您不能。我想标准之所以这么说是因为按位指针操作几乎普遍会导致未定义或(充其量)实现定义的行为。因此,与加法等更简单的操作不同,您将无法做任何既有用又可移植的事情。

但是你可以通过强制转换来解决它:

#include <stdint.h>

void *ptr1;
// Find page start
void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff)

至于 C++,只需使用reinterpret_cast而不是 C 风格的演员表。

于 2013-04-07T21:58:12.980 回答
7

这是不允许的,因为语义没有很好地定义。不过,您当然可以做到。只需转换为uintptr_t,执行操作,然后转换回指针类型。这也适用于 C++。

于 2013-04-07T21:58:01.433 回答
4

您不能在指针上使用按位运算符,因为标准对指针的表示方式以及任何特定指针可以处理的值范围的要求很少。所以没有定义在指针上使用这些运算符意味着什么。

尽管如此,大多数机器上的大多数编译器都使用内存地址的明显映射作为指针的值。其中大多数将让您将指针转换为整数类型。然后,您可以对值进行按位运算,甚至将其转换回指针。但这通常不是严格可移植的或定义明确的。

于 2013-04-07T21:59:04.873 回答