我喜欢将我的变量初始化为一些“dummy”值,并开始使用int64_t和uint64_t.到目前为止,看起来我至少有三种方法可以将int64_t初始化为特定的值(对于未签名的等效项,稍微更改):
int64_t method_one = 0; int64_t method_two = 0LL; int64_t method_three = INT64_C(0);
我使用GCC和目标OS X和Linux.我想选择一种旨在便于携带和清晰的方法 – 但是正确性,首先.我是否反思这个,还是有一个“最好的”或“最推荐的”方法来初始化这个变量类型,对于我抛出的任何特定值(当然在它的范围内)?
解决方法
int64_t method_one = 0;
…完全合理. C99(参见例如草案here;是的,我知道这不是最新的标准,但是引入了int N类型的那个)说:
> 0有类型int(§6.4.4.1para.5);
>表达式的类型是int64_t(§6.5.16para.3);
>右侧的类型将转换为表达式的类型(§6.5.16.1para.2);
>此转换不会改变价值(§6.3.1.3para.1).
所以没有任何错误,没有任何错误,缺乏额外的杂乱使它成为最可读的选项,当初始化为0或任何其他范围内的int.
int64_t method_two = 0LL;
int64_t不能保证与long long相同;然而,这实际上对于任何带符号的64位值也是可移植的(对于无符号的64位值也是类似的ULL):长整型(和无符号长整型)在符合C99的实现中至少应该是64位( §5.2.4.2.1),所以LL(和ULL)应始终对于初始化64位值是安全的.
int64_t method_three = INT64_C(0);
对于可能在int范围之外的值来说,这可能是一个更好的选择,因为它更清楚地表达了意图:INT64_C(n)将扩展为适合于(至少)64位范围内的任何n(见§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更可读.)