如何输入int64_t/uint64_t常量?

fik*_*tor 7 c++ compiler-errors const g++ 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; }
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 28

你可以使用宏:

UINT64_C
Run Code Online (Sandbox Code Playgroud)

为了定义一个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标题的这个特性以及stdint.hposix引用.

  • 我还会包含此链接以供参考:http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdint.h.html (2认同)

Zac*_*and 13

您正在寻找的语法是:

const uint64_t test = 1ULL << 30;
Run Code Online (Sandbox Code Playgroud)

后修复ULL用于至少64位宽的无符号整数文字.

  • 这是不正确的.如果使用uint64_t定义整数类型,则应使用相应的文字符号UINT64_C(arg)."ULL"后缀与"unsigned long long"完全对应,而uint64_t可能不对应,具体取决于平台.这种平台独立性是您首先使用uint64_t的唯一原因. (5认同)
  • 在uint64_t == unsigned long long的平台上,UINT64_C将扩展为ULL.在uint64_t == unsigned long的平台上,UINT64_C将扩展为UL.请阅读stdint.h. (4认同)
  • @fiktor这不是一个"简短符号",这是用于编写指定大小的数字文字的*符号.使用cast方法最终会在第一个编译器传递中对其进行优化(对于任何远程合适的编译器). (3认同)
  • 如果您只关心uint64_t == unsigned long long的平台,那么您的解决方案可以正常工作.但是,为什么不首先使用unsigned long long作为您的数据类型?我正在竞争的初始陈述仍然是错误的,"ULL是针对无符号的64位整数".一个真实的陈述是,ULL用于无符号长整数. (2认同)

clc*_*cto 6

(uint64_t 1)是无效的语法.在施法时,你可以使用uint64_t(1)(uint64_t) 1.注释掉的示例有效,因为它遵循正确的转换语法,如下所示:

const uint64_t test = ((uint64_t)1) << 30;
Run Code Online (Sandbox Code Playgroud)

编辑:虽然这直接回答了问题,但请参阅Shafik Yaghmour关于如何正确定义具有特定大小的整数常量的答案.