左移计数 >= 类型宽度

left shift count >= width of type

本文关键字:类型 gt 左移      更新时间:2023-10-16

我知道这是以前在堆栈溢出上被问到的问题,但我已经尝试了所有建议的解决方案,但没有任何效果。我的问题很简单,我正在尝试定义一个unsigned long,它必须取允许的最大可能值。

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

其中ulong类型定义为unsigned long。我得到一个警告,左移计数>= type的宽度。我已经检查了64位机器上unsigned long的大小,它是8B。最后,我尝试用-m64标志编译,但都是徒劳的。

任何想法?

发生错误,因为您的宏包含分号。先修复这些错误,你的代码就可以编译了。

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

另外,请与类型一致。在简短的代码片段中,您混合了unsigned long, unsigned long (ULL)和long.

我不知道为什么你需要做位移位方法。考虑简单地将一个非常大的-1转换为unsigned类型,如下面的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 %un", NUM_BITS);
  printf("Large value 1 is %llun", LARGEST_VALUE_1);
  printf("Large value 2 is %llun", LARGEST_VALUE_2);
  printf("Large value 3 is %llun", LARGEST_VALUE_3);
  return 0;
}

程序输出为:

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