假设我有以下内容:
#define MAX (16 * 1024 * 1024 * 1024)
#define MIN (1 * 1024 * 1024 * 1024)
这将使MAX =0。我认为这是因为定义仅使用32位进行定义。有没有一种方法可以使用64位,或者我需要重新编写代码以使定义可以处理较小的值?
这将使MAX = 0
否,这将在预处理阶段将MAX替换为文字标记( 16 * 1024 * 1024 * 1024 )
。
我认为这是因为定义仅将32位用于定义
[define不使用any位,它只是文本替换。
是否有办法为此使用64位
显式地使用类型可能比使用整数立即数后缀更好,因为它更确切地表明您获得了多少位:
#define MAX ((uint64_t)16 * 1024 * 1024 * 1024)
或
#define MAX (16ll * 1024 * 1024 * 1024)
发生这种情况的原因是所有这些常量都隐式为int
类型。就您而言,这似乎是32位类型。如果这是您想要的行为,则需要确保您使用的是64位类型。
您可以强制转换以确保它是64位类型:
#define MAX ((int64_t)16 * 1024 * 1024 * 1024)
或者只是自己扩展数学:
#define MAX 17179869184
宏本身对位不敏感,但使用它的代码可能对位敏感。如果要确保始终将常量MAX
视为long long
,则可以将其定义为“17179869184LL”或“ 17179869184i64”(仅MSVC)。
更好:
const long long int MAX = 17179869184LL;
我希望
#define MAX (16LL * 1024LL * 1024LL * 1024LL)