在不知道指针是32位还是64位的情况下,我正在寻找一种简便且优雅的方法来设置指针类型的高位。
我正在处理从一家已停业的公司继承的一些旧代码。它曾经在32位环境中工作,现在我们也需要64位版本。这意味着比以前更大的指针,以及更大的幻数表示无效值。目前,最佳建议大致如下:
#if ENVIRONMENT_IS_32_BIT
#define INVALID_PTR_CODE 0x80000000
#else
#define INVALID_PTR_CODE 0x8000000000000000
#endif
正如我所说,我希望有一些更优雅的东西,并且希望能在不同的编译器(至少MSVC,gcc,clang)中运行。完美的解决方案适用于任何环境/大小的指针。
答案 0 :(得分:4)
static_cast<uintptr_t>(1) << (CHAR_BIT * sizeof(void*) - 1)
会这样做。
(请注意,当前的Intel芯片系列背后有48位指针。)
答案 1 :(得分:3)
要获取指针的大小(以字节为单位),可以使用sizeof(void *)
(以sizeof(void *) * CHAR_BIT
为单位)。现在,您需要在该位置获得1(请记住,它是基于0的),因此您可以执行1ULL << (sizeof(void *) * CHAR_BIT - 1)
。然后,将其与您的电话号码相乘。
答案 2 :(得分:0)
考虑以下代码:
int *x = (int*)-1; //You set all the bits of `x`
int *y = (int*)((unsigned long long)x >> 1); //y has all bits set besides the msb
x = (int*)(x - y); //subtract y from x to have only th msb set