int64_t method_one = 0;
……完全合理。C99(参见此处的草案;是的,我知道它不再是最新的标准,但它是引入int<N>_t
类型的标准)说:
0
具有类型int
(§6.4.4.1 第 5 段);
- 表达式的类型是
int64_t
(§6.5.16 para.3);
- 右侧的类型将转换为表达式的类型(第 6.5.16.1 段第 2 节);
- 此转换不会更改值(§6.3.1.3 第 1 段)。
所以这完全没有问题,并且没有额外的混乱使得它在初始化为 0 或int
.
int64_t method_two = 0LL;
int64_t
不保证与long long
; 然而,这实际上也应该适用于任何有符号的 64 位值(ULL
对于无符号的 64 位值也是如此):long long
(and unsigned long long
) 在符合 C99 的实现中应该至少为 64 位(§5.2.4.2.1 ),因此LL
(and ULL
) 对于初始化 64 位值应该始终是安全的。
int64_t method_three = INT64_C(0);
对于可能在范围之外的值,这可以说是一个更好的选择int
,因为它更清楚地表达了意图:INT64_C(n)
将扩展到适合n
(至少)64 位范围内的任何值(一般参见第 7.18 节,以及特别是第 7.8.4.1 节)。
在实践中,我可能会根据上下文使用上述任何一种。例如:
uint64_t counter = 0;
(为什么要添加不必要的混乱?)
uint64_t some_bit = 1ULL << 40;
(除非非常宽,1 << 40
否则根本无法工作;在这里对我来说似乎不太可读。)int
UINT64_C(1) << 40
uint64_t some_mask = UINT64_C(0xFF00FF00FF00FF00);
(在这种情况下,将值显式调用为 64 位常量对我来说似乎比写更易读0xFF00FF00FF00FF00ULL
。)