如何输入int64_t / uint64_t常量?

时间:2014-03-12 20:29:41

标签: c++ compiler-errors g++ const int64

我要做的是定义一个等于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; }

3 个答案:

答案 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有关如何正确定义特定大小的整数常量的信息。