微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

哪个初始化器适合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更可读.)

原文地址:https://www.jb51.cc/c/114369.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐