加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

哪个初始化器适合int64_t?

发布时间:2020-12-16 05:35:15 所属栏目:百科 来源:网络整理
导读:我喜欢将我的变量初始化为一些“dummy”值,并开始使用int64_t和uint64_t.到目前为止,看起来我至少有三种方法可以将int64_t初始化为特定的值(对于未签名的等效项,稍微更改): int64_t method_one = 0;int64_t method_two = 0LL;int64_t method_three = INT64_
我喜欢将我的变量初始化为一些“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更可读.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读