int64_t method_one = 0;
...完全に合理的です。C99 (ここでドラフトなどを参照してください。はい、最新の標準ではないことはわかっていますが、int<N>_t
型を導入したものです) は次のように述べています。
0
has タイプ( §6.4.4.1 int
para.5);
- 式のタイプは
int64_t
(§6.5.16 para.3) です。
- 右辺の型は式の型に変換されます (§6.5.16.1 para.2);
- この変換は値を変更しません (§6.3.1.3 para.1)。
したがって、それにはまったく問題はありません。追加の混乱がないため、 0 または an の範囲内の何かに初期化するときに、最も読みやすいオプションになりますint
。
int64_t method_two = 0LL;
int64_t
と同じであるとは限りませんlong long
。ただし、これは実際には、符号付き 64 ビット値に対しても移植可能に機能するはずです (符号なし 64 ビット値に対しても同様ULL
です): long long
(およびunsigned long long
) C99 準拠の実装では、少なくとも 64 ビットである必要があります (§5.2.4.2.1 ) であるため、LL
(and ULL
) は 64 ビット値の初期化に対して常に安全である必要があります。
int64_t method_three = INT64_C(0);
int
これは、意図をより明確に表現するため、an の範囲外にある可能性のある値に対しては間違いなくより良いオプションです: (少なくとも) 64 ビット範囲内のINT64_C(n)
any に適したものに展開されます (一般に §7.18 を参照してください)。n
特に§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
読みやすいように思えます。)