哪个初始化程序适用于int64_t?

Ale*_*lds 13 c gcc int64

我喜欢将我的变量初始化为一些"虚拟"值,并开始使用int64_tuint64_t.到目前为止,看起来我至少有三种方法可以初始化int64_t一个特定的值(并且对于无符号的等价物稍有改动):

int64_t method_one   = 0;
int64_t method_two   = 0LL;
int64_t method_three = INT64_C(0);
Run Code Online (Sandbox Code Playgroud)

我使用GCC并针对OS X和Linux.我想选择一种旨在简化便携性和清晰度的方法 - 但最重要的是正确性.我是否过度思考这个,或者是否有一个"最佳"或"最推荐"的方法来初始化这个变量类型,对于我抛出的任何特定值(当然,它在其范围内)?

Mat*_*ery 8

int64_t method_one   = 0;
Run Code Online (Sandbox Code Playgroud)

......完全合情合理.C99(参见例如这里的草案;是的,我知道它不再是最新的标准,但它是引入int<N>_t类型的那个)说:

  • 0具有类型int(§6.4.4.1第5段);
  • 表达式的类型是int64_t(§6.5.16第3段);
  • 右侧的类型将转换为表达式的类型(§6.5.16.1para.2);
  • 此转换不会改变该值(§6.3.1.3第1段).

因此,根本没有任何问题,并且当初始化为0或其他任何范围时,缺乏额外的混乱使其成为最可读的选项int.

int64_t method_two   = 0LL;
Run Code Online (Sandbox Code Playgroud)

int64_t不保证是一样的long long; 但是,实际上这对于任何带符号的64位值都是可移植的(ULL对于无符号的64位值也是如此):( long longunsigned long long)在符合C99的实现中应至少为64位(§5.2.4.2.1) ),所以LL(和ULL)应始终安全地初始化64位值.

int64_t method_three = INT64_C(0);
Run Code Online (Sandbox Code Playgroud)

对于可能超出a范围的值,这可以说是更好的选择int,因为它更清楚地表达了意图:INT64_C(n)将扩展到适合任何n(至少)64位范围内的任何值(一般见§7.18,以及特别是§7.8.4.1).


在实践中,我可能会使用上述任何一种,具体取决于具体情况.例如:

uint64_t counter = 0;
Run Code Online (Sandbox Code Playgroud)

(为什么要添加不必要的混乱?)

uint64_t some_bit = 1ULL << 40;
Run Code Online (Sandbox Code Playgroud)

(1 << 40除非int异常宽阔,否则根本不会起作用;而且UINT64_C(1) << 40我在这里似乎不太可读.)

uint64_t some_mask = UINT64_C(0xFF00FF00FF00FF00);
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,显式地将值作为64位常量调用似乎比写入更具可读性0xFF00FF00FF00FF00ULL.)


md5*_*md5 7

个人而言,我会使用第三种,这是实现这一目标的最便携方式.

#include <stdint.h>

int64_t method_three  = INT64_C(0);
uint64_t method_three = UINT64_C(0);
Run Code Online (Sandbox Code Playgroud)

无论如何,我认为这不是一件非常重要的事情.