2016-06-24 25 views
3

私は問題があります -1にenumを代入すると戻り値は255ですか?C:列挙型に負の値を割り当てますか?

typedef enum test { 
     first, 
     second, 
}soc_ctr_type_t 

soc_ctr_type_t ctype; 

switch(type){ 
    case 1: 
     ctype = first; 
    break; 
    case 2: 
     ctype = second; 
    break; 
    default: 
     ctype = -1; 
} 

タイプ==デフォルトならば、私は見てのprintfを使用する場合、ctype関数は-1でなければなりませんが、それはありません、 、のctype == 255 誰かが私を助けることができますか?

+1

をお読みください。つまり、コンパイラは、列挙のすべての値に対応する整数型を選択します。おそらく、 'typedef enum test {...、third = -1、} soc_ctr_type_t'を追加して、コンパイラが符号付き整数型を選択するようにするのは良い考えです。 –

+0

問題が解決した場合は、大きなチェックボックスをクリックして答えとして受け入れます。これはコミュニティにあなたが解決策を見つけたことを示し、あなたと回答者にいくつかの評判を与えます。 – 2501

答えて

4

は、列挙子リストにその値を列挙子を定義して、結果が正しいだろうありがとう:

typedef enum test { 
     minus_one = -1 , 
     first, 
     second, 
} soc_ctr_type_t; 

コンパイラは、この列挙子のために狭いunsigned型を選んだので、あなたは255を見ている理由は、それはすべてfirst,secondの値0,1を持つことができるからです。したがって、2つの値を表すことができるので、選択されるタイプはunsigned charです。
このタイプは-1から255にラップされます。

Cの列挙子は特殊な型ではなく、整数型で表されるため、列挙子リストに存在しない列挙子に値を割り当てることができます。

+0

それはコンパイラに依存しますか?私にとっては-1になる。 – sas

+0

@sas実装が定義されています。 – 2501

+0

ありがとうございます – sas

1

ここに2501の回答があります。

列挙の基本タイプは 列挙で定義されているすべての列挙値を表すことができる整数型です。列挙子の値がint またはunsigned intに収まらない場合を除き、基底型がintより大きい でないことを除いて、列挙型の基底型として 実装型定義が使用されています。

もう一つの良いは、コードのいくつかの断片は、通常は何が起こっているかを判断するだけでは十分ではないAre C++ enums signed or unsigned?

関連する問題