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