C++ 为什么可以';在C语言中对指针进行位运算,有没有办法解决这个问题?

C++ 为什么可以';在C语言中对指针进行位运算,有没有办法解决这个问题?,c++,c,pointers,bit-manipulation,C++,C,Pointers,Bit Manipulation,我读到你不能在指针上做位掩码,为什么你不能呢 指针上的位操作 有没有办法达到同样的效果 是否同样适用于C++?,因为语义没有很好地定义,所以不允许。不过,你当然可以做到。只需转换为uintptr\u t,执行操作,然后转换回指针类型。这也将在C++中工作。< P>你不能做按位指针操作的原因是因为标准说你不能。我想,该标准之所以这么说,是因为按位指针操作几乎普遍会导致未定义或(最多)实现定义的行为。因此,与加法等更简单的操作不同,您无法做任何既有用又可移植的操作 但你可以通过施展才华来解决这个问题

我读到你不能在指针上做位掩码,为什么你不能呢 指针上的位操作

有没有办法达到同样的效果


是否同样适用于C++?

,因为语义没有很好地定义,所以不允许。不过,你当然可以做到。只需转换为
uintptr\u t
,执行操作,然后转换回指针类型。这也将在C++中工作。

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

但你可以通过施展才华来解决这个问题:

#include <stdint.h>

void *ptr1;
// Find page start
void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff)
#包括
void*ptr1;
//查找页面开始
void*ptr2=(void*)((uintpttr_t)ptr1&~(uintpttr_t)0xfff)

<> P> > C++,只需使用“代码> RealTytCase< /Cord>”代替“C样式”转换。

< P>不能使用指针上的位运算符,因为标准对指针如何表示以及任何特定指针的值范围可能都不太有要求。所以没有定义在指针上使用这些运算符意味着什么


然而,大多数机器上的大多数编译器使用内存地址的明显映射作为指针的值。其中大多数都允许您将指针强制转换为整数类型。然后可以对该值执行位操作,甚至可以将其转换回指针。但这并不是严格的可移植性,也不是很好的定义。

我很好奇您的用例。你能详细说明一下吗?你想达到什么“效果”?指针上的位操作真的没有意义。很可能是对齐分配,因为运行时通常为您提供了机制,所以实际上不再需要对齐分配。@KeithThompson:也许您想查找页面边界。要扩展我之前的评论,鉴于语言标准对指针的规定,指针上的位操作毫无意义。对于给定的系统来说,它们可能是有意义的——在这种情况下,您可以使用各种技巧,其中大部分涉及铸造。但是如果你能准确地告诉我们你想要实现什么,你的问题和答案对未来的读者会更有用。指针上的位操作不是目标,而是实现其他目标的一种手段。另一个目标是什么?其实很烦人。C、 几十年来一直被称为操作系统和嵌入式系统的“高级”语言,这两种类型的开发基本上都是不可移植的,但它们仍然拒绝接受它现在最适合的角色。谢天谢地,c99终于识别出了一些硬整数类型,内存管理代码没有理由必须多次强制转换每个变量来执行简单的掩码操作。@duanev从好的方面讲,大多数强制转换在运行时并没有花费任何成本。编译器几乎可以确定您只想修改值,在CPU级别,指针和任何其他整数之间没有任何有意义的区别,因此它几乎可以确定只进行算术运算,没有强制转换逻辑。@duanev Yes。我看不出这与我所说的有什么矛盾。我为什么要在这里使用reinterpret_cast而不是static_cast?@NicoBerrogorry:因为
static_cast
无法将
void*
转换为
uintptr\u t
,反之亦然。如果您使用
static\u cast
您的程序甚至不应该编译。