设置未知长度的整数类型的高位

时间:2018-10-19 14:25:56

标签: c++

在不知道指针是32位还是64位的情况下,我正在寻找一种简便且优雅的方法来设置指针类型的高位。

我正在处理从一家已停业的公司继承的一些旧代码。它曾经在32位环境中工作,现在我们也需要64位版本。这意味着比以前更大的指针,以及更大的幻数表示无效值。目前,最佳建议大致如下:

#if ENVIRONMENT_IS_32_BIT
#define INVALID_PTR_CODE 0x80000000
#else
#define INVALID_PTR_CODE 0x8000000000000000
#endif

正如我所说,我希望有一些更优雅的东西,并且希望能在不同的编译器(至少MSVC,gcc,clang)中运行。完美的解决方案适用于任何环境/大小的指针。

3 个答案:

答案 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