我应该使用static_cast还是INT64_C来便携地分配64位常量?

Mas*_*Man 3 c++ static-cast int64

将64位常量指定为

int64_t foo = 0x1234LL;
Run Code Online (Sandbox Code Playgroud)

是不便携的,因为long long 不一定int64_t.这篇文章哪个初始化程序适合int64_t?讨论了使用INT64_C()<stdint.h>,但是也不可能使用static_castas

int64_t foo = static_cast<int64_t>(0x1234);
Run Code Online (Sandbox Code Playgroud)

我应该选择哪一个,为什么,或者两者都运作良好?

我在互联网上搜索了SO,但没有找到任何static_cast选项被探索的地方.我也做过测试,sizeof()以确认它在简单的情况下工作.

Jos*_*eld 6

实际上,long longC实现限制标头保证至少为64位<climits>.类型对象的最小值和最大值的最小限制long long如下:

LLONG_MIN   -9223372036854775807 // ?(2^63 ? 1)
LLONG_MAX   +9223372036854775807 // 2^63 ? 1
Run Code Online (Sandbox Code Playgroud)

这对应于带符号的64位整数.如果没有至少64个信息位,则无法存储这样的值范围.

所以继续使用0x1234LL.实际上,您可以使用无后缀,因为将选择适合该值的以下第一种类型:

Suffix | Decimal constants | Octal or hexadecimal constant
-------|-------------------|------------------------------
none   | int               | int
       | long int          | unsigned int
       | long long int     | long int
       |                   | unsigned long int
       |                   | long long int
       |                   | unsigned long long int
...    | ...               | ...
Run Code Online (Sandbox Code Playgroud)