代码之家  ›  专栏  ›  技术社区  ›  Tim Randall

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

c++
  •  1
  • Tim Randall  · 技术社区  · 7 年前

    我正在研究一些我们从一家倒闭的公司继承的遗留代码。它以前在32位环境下工作,现在我们也需要一个工作的64位版本。这意味着指针要比以前大得多,并且用更大的幻数来表示无效值。目前最好的方案大致如下:

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

    3 回复  |  直到 7 年前
        1
  •  4
  •   Bathsheba    7 年前
    static_cast<uintptr_t>(1) << (CHAR_BIT * sizeof(void*) - 1)
    

    (请注意,目前的英特尔芯片有48位指针在引擎盖下。)

        2
  •  3
  •   Kon    7 年前

    要获取指针的字节大小,可以使用 sizeof(void *) ,以位表示 sizeof(void *) * CHAR_BIT 1ULL << (sizeof(void *) * CHAR_BIT - 1) . 那就用你的号码吧。

        3
  •  0
  •   Petok Lorand    7 年前

    考虑以下代码:

    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