14

変数を「ダミー」値に初期化するのが好きで、 and を使い始めましint64_tuint64_t。これまでのところ、 を特定の値に初期化するには少なくとも 3 つの方法があるようint64_tです (符号なしの同等の値を少し変更します)。

int64_t method_one   = 0;
int64_t method_two   = 0LL;
int64_t method_three = INT64_C(0);

私は GCC を使用し、OS X と Linux をターゲットにしています。移植のしやすさと明快さを目指した方法を選びたいと思いますが、何よりも正確さを重視します。私はこれを考えすぎていますか、それとも、この変数の型を初期化するための「最良の」または「最も推奨される」アプローチはありますか?

4

3 に答える 3

8
int64_t method_one   = 0;

...完全に合理的です。C99 (ここでドラフトなどを参照してください。はい、最新の標準ではないことはわかっていますが、int<N>_t型を導入したものです) は次のように述べています。

  • 0has タイプ( §6.4.4.1 intpara.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除き、単に機能しません。ここでは読みにくいようです。)intUINT64_C(1) << 40

uint64_t some_mask = UINT64_C(0xFF00FF00FF00FF00);

(この場合、値を 64 ビット定数として明示的に呼び出した方が、書くより0xFF00FF00FF00FF00ULL読みやすいように思えます。)

于 2012-11-08T00:39:44.610 に答える
7

個人的には、これを実現する最も移植性の高い方法である 3 番目の方法を使用します。

#include <stdint.h>

int64_t method_three  = INT64_C(0);
uint64_t method_three = UINT64_C(0);

いずれにせよ、私はそれが非常に重要なことだとは思わない。

于 2012-11-07T17:51:33.693 に答える
0

ANSI C規格によると、along long intとの接尾辞unsigned long long intはそれぞれLLとです。ULL

llまたはLLの末尾にllまたはLLが付いた8進数または16進数longlongint、 uまたはUの両方が末尾に付いたunsigned long long int 10進数、8進数、または16進数、およびllまたはLL unsigned long long int

あなたがそれint64_tが次のように定義されていることを知っているなら:

typedef signed long long int int64_t

次に、方法2が最も確実に正しい方法です。

int64_t method_two   = 0LL;
uint64_t method_two   = 0ULL;

編集

移植性の問題と、として定義されることが保証されていないという事実を念頭に置いてlong long、3番目の方法を使用することをお勧めします。

INT64_C()
UINT64_C()
于 2012-11-07T17:58:14.577 に答える