哪个初始化器适合int64_t?

我喜欢将我的变量初始化为一些“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更可读.)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...