我应该使用static_cast还是INT64_C来可移植地分配64位常量

Should I use static_cast or INT64_C to assign 64-bit constant portably?

本文关键字:可移植 分配 常量 64位 INT64 static cast 还是 我应该      更新时间:2023-10-16

将64位常量指定为

int64_t foo = 0x1234LL;

是不可移植的,因为long long不一定是int64_t。这篇文章哪个初始值设定项适用于int64_t?讨论了<stdint.h>INT64_C()宏的使用,但是否也可以使用static_cast作为

int64_t foo = static_cast<int64_t>(0x1234);

我应该更喜欢哪一个,为什么,或者两者都很好吗?

我在互联网和SO上搜索过,但没有找到任何探索static_cast选项的地方。我还使用sizeof()进行了测试,以确认它在简单的情况下有效。

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

LLONG_MIN   -9223372036854775807 // −(2^63 − 1)
LLONG_MAX   +9223372036854775807 // 2^63 − 1

这对应于一个有符号的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
...    | ...               | ...