我要做的是定义一个等于2 ^ 30的常数(我可以将它改为2 ^ 34,所以我更喜欢有一个大于32位的空间)。
为什么下面的最小(?)示例不能编译?
#include <stdint.h>
// test.cpp:4:33: error: expected primary-expression before numeric constant
// test.cpp:4:33: error: expected ')' before numeric constant
const uint64_t test = (uint64_t 1) << 30;
//const uint64_t test1 = (uint64_t(1)) << 30;// this one magically compiles! why?
int main() { return 0; }
答案 0 :(得分:28)
您可以使用宏:
UINT64_C
定义一个64位无符号整数文字,cstdint
标题提供了用于定义特定大小的整数文字的宏,我们在18.4.1
标题概要部分中看到:
标题还定义了许多形式的宏:
并包括:
加上形式的函数宏:
[U] INT {8 16 32 64 MAX} _C
我们必须回到C99草案标准,找到它们的工作原理,7.18.4.1
宏用于最小宽度整数常量,其中包含:
[...]如果uint_least64_t是unsigned long long int类型的名称, 然后 UINT64_C(0x123)可能会扩展为整数常量0x123ULL 。
作为定义64位整数常量表达式的正确方法。遗憾的是,这不是关于cpprefernce的文档,但cplusplus.com确实记录了cstdint
标题以及posix reference for stdint.h的此功能。
答案 1 :(得分:12)
您正在寻找的语法是:
const uint64_t test = 1ULL << 30;
post-fix ULL
用于至少64位宽的无符号整数文字。
答案 2 :(得分:6)
(uint64_t 1)
是无效的语法。投射时,您可以使用uint64_t(1)
或(uint64_t) 1
。注释掉的示例有效,因为它遵循正确的转换语法,如下所示:
const uint64_t test = ((uint64_t)1) << 30;
编辑:虽然这直接回答了问题,但请参阅answer by Shafik Yaghmour有关如何正确定义特定大小的整数常量的信息。