左移计数> =类型的宽度

时间:2014-05-06 04:55:06

标签: c++ c g++ bit-shift

我知道这个先前已经被问过堆栈溢出的东西,但我已经尝试了所有建议作为解决方案,但没有任何作用。我的问题很简单,我正在尝试定义一个无符号长整数,它必须采用允许的最大可能值。

#define SIZEOF_ULONG (sizeof(long) * 8);
#define LARGEST_VALUE (1ULL << ((SIZEOF_ULONG)-1));

其中ulong的typedef为无符号long。我收到一个警告,左移计数&gt; =类型的宽度。我在我的64位机器上检查了unsigned long的大小,它是8B。最后,我尝试使用-m64标志进行编译,但都是徒劳的。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

发生错误,因为您的宏包含分号。首先修复这些错误,然后编译代码。

(我想发出了关于位移的警告,因为编译器看到类似1ull << 64; - 1的内容。真正的错误是分号,但也会发出移位64位的警告。)

另外,请与类型保持一致。在您的简短代码段中,您可以混合使用无符号长整数,无符号长整数(ULL)和长整数。

答案 1 :(得分:3)

我不确定为什么你需要做位移方法。 考虑简单地将非常大的-1转换为您的无符号类型,如下面的LARGEST_VALUE_3所示。我认为你选择LARGEST_VALUE_2LARGEST_VALUE_1是完全错误的(但是之前已经提出过)。

#include <stdio.h>
#include <stdint.h>

typedef uint64_t ulong; /* Use of uint32_t, uint16_t, or uint8_t are recommended */

#define NUM_BITS        (sizeof(ulong) * 8)
#define LARGEST_VALUE_1 (1ULL << (NUM_BITS-1)) /* This answer is wrong */
#define LARGEST_VALUE_2 ((1ULL << NUM_BITS)-1) /* This answer is sometimes correct (except when NUM_BITS is >= 64) */
#define LARGEST_VALUE_3 ((ulong)(-1LL))        /* This is a simple answer */

int main(int argc, char* argv[])
{
  printf("Bits in ULONG %u\n", NUM_BITS);
  printf("Large value 1 is %llu\n", LARGEST_VALUE_1);
  printf("Large value 2 is %llu\n", LARGEST_VALUE_2);
  printf("Large value 3 is %llu\n", LARGEST_VALUE_3);
  return 0;
}

节目输出是:

Bits in ULONG 64
Large value 1 is 9223372036854775808
Large value 2 is 18446744073709551615
Large value 3 is 18446744073709551615