1

iPhone サンプル プロジェクト (Xcode IDE、Apple LLVM コンパイラ 4.2) のコードを読んでいます。その iPhone サンプル プロジェクトの外部ライブラリ (C で記述) のヘッダー ファイルには、列挙型で宣言されたいくつかのイベントがあります。

typedef enum _Application_Events
{
    EVENT_EXIT = 0x80000000,
    EVENT_TOUCH,
    EVENT_DRAG,
    EVENT_RELEASE_TOUCH,
    EVENT_ROTATE_0,
    EVENT_ROTATE_90,
    EVENT_ROTATE_180,
    EVENT_ROTATE_270
} Application_Events;

これらのイベントにどのような値が割り当てられているかわかりません。大きな正の整数 ( )、または負のゼロ、または負の整数 ( ) で0x80000000あるはずですか?2147483648-2147483648

Xcode デバッガーで調べました。コンパイラーは Apple LLVM コンパイラー 4.2、EVENT_EXITequals(int) -2147483648EVENT_RELEASE_TOUCHequals(int) -2147483645などです。

どうやら、それらは2 の補数表現で扱われます。関連する投稿はここにあります。

しかし、私が今確信していないのは、次のとおりです。

0x80000000(1)常に存在するための基礎となるデータ型、intまたは他の状況で何か他のもの? これはコンパイラまたはプラットフォームに依存していますか?

(2) このように符号付き整数に 16 進数値を割り当てた場合、常に 2 の補数表現として解釈されますか? これはコンパイラまたはプラットフォームに依存していますか? 関連する投稿はこちらにあります。別のリファレンスはここにあります。

いくつかのアイデアを共有してください。ありがとうございました:D

4

4 に答える 4

3

C に似た言語の多くのものと同様に、列挙は単なる整数です。このように最初の値を設定すると、コンパイラはそこからインクリメントし、すべての列挙値が 0 未満であることを保証します (2 の補数による符号付き整数として、設定されている上位ビットは負の数を示します)。

おそらく、プログラマーはさまざまな種類のイベントを送信できるようにするためにこの値を選択し、他のイベントと衝突しないようにしました。

要するに、実際の値について心配する必要はありません。それはただの数字です。名前を使用して、それらのコードを使用または返す呼び出しのコンテキストでの意味を理解してください。

于 2013-04-23T03:25:13.837 に答える
2

列挙の基本型は実装定義です。この場合、基本型は である必要がありますunsigned int。これは、コンパイラがすべての列挙値を保持するのに十分な幅の基本型を選択することを標準が要求しているためです。C99 標準のセクション 6.7.2.2.4 から:

各列挙型はchar、符号付き整数型、または符号なし整数型と互換性があります。型の選択は実装定義である108)が、列挙のすべてのメンバーの値を表すことができなければならない。}列挙型は、列挙子宣言のリストを終了する の後まで不完全です。

108) 実装は、すべての列挙定数が確認されるまで、どの整数型の選択を遅らせることができます。

于 2013-04-23T03:23:43.407 に答える
1

の基になる型は、enum保持する必要がある値に依存します。コンパイラには、その型を最終的にどのように定義するかについて、ある程度の自由度があります。あなたの場合、 の基になる型はApplication_Eventsよりunsigned intも大きいため、 のサイズが 32 ビットであるとINT_MAX仮定して(一般に an とは)、 である可能性があります。しかし、次のようなもの:intenum

enum foo_t {
   FOO_Start,
   FOO_Thing,
   FOO_Another_Thing,
   FOO_End
};

の型はenum foo_tまたはintですunsigned int

ただし、列挙定数(たとえば、EVENT_EXITFOO_Startなど) は 型intです。それがデバッガーに表示されているものです。あなたが何かをするなら

Application_Events foo = EVENT_EXIT;

のタイプfoounsigned. この質問は少し変わったと思います。

1) iPhone の場合、定数0x80000000はおそらくunsigned(iPhone ARM プロセッサには 32 ビットintの s があります)。その値は、プラットフォームと使用されている C のバージョンによって異なります。

2) 実際には、ほとんどのプラットフォームで 2 の補数演算が使用されているため、プロセッサが 2 の補数演算をサポートすると想定できます。ただし、C 言語自体がそれを保証するものではありません。他の算術方式 (1 の補数、符号付きマグニチュード) も使用できます。

于 2013-04-23T03:28:00.473 に答える