我知道这个先前已经被问过堆栈溢出的东西,但我已经尝试了所有建议作为解决方案,但没有任何作用。我的问题很简单,我正在尝试定义一个无符号长整数,它必须采用允许的最大可能值。
#define SIZEOF_ULONG (sizeof(long) * 8);
#define LARGEST_VALUE (1ULL << ((SIZEOF_ULONG)-1));
其中ulong的typedef为无符号long。我收到一个警告,左移计数&gt; =类型的宽度。我在我的64位机器上检查了unsigned long的大小,它是8B。最后,我尝试使用-m64标志进行编译,但都是徒劳的。
有什么想法吗?
答案 0 :(得分:5)
发生错误,因为您的宏包含分号。首先修复这些错误,然后编译代码。
(我想发出了关于位移的警告,因为编译器看到类似1ull << 64; - 1
的内容。真正的错误是分号,但也会发出移位64位的警告。)
另外,请与类型保持一致。在您的简短代码段中,您可以混合使用无符号长整数,无符号长整数(ULL
)和长整数。
答案 1 :(得分:3)
我不确定为什么你需要做位移方法。
考虑简单地将非常大的-1转换为您的无符号类型,如下面的LARGEST_VALUE_3
所示。我认为你选择LARGEST_VALUE_2
和LARGEST_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