ARM の enum の動作

enum ETest1{
    t1 = 0 ,
    t2 = 255 ,
};
enum ETest2{
    t3 = 256 ,
};
enum ETest3{
    t4 = 65536 ,
};
enum ETest4{
    t5 = -10 ,      // ARM ではコンパイルエラー
    t6 = 0xffffffff ,
};
ETest1 e1;
ETest2 e2;
ETest3 e3;
ETest4 e4;
DBGPRINTF( "e1 : %d" , sizeof( e1 ) );
DBGPRINTF( "e2 : %d" , sizeof( e2 ) );
DBGPRINTF( "e3 : %d" , sizeof( e3 ) );
DBGPRINTF( "e4 : %d" , sizeof( e4 ) );

こんなプログラムを実行してみると、

// Windows
e1 : 4
e2 : 4
e3 : 4
e4 : 4
// ARM
e1 : 1
e2 : 2
e3 : 4
e4 : 4

こういう結果になります。
ARM の場合は、中に入っている値によってサイズが変わるみたいです。


また、こんな結果も出ました。

enum ETest5{
    t7 = 0 ,
};
enum ETest6{
    t8 = -2 ,
};
ETest5 e5 = (ETest5)-1;
if( t7 > e5 )   DBGPRINTF( "t7 is signed" );
else            DBGPRINTF( "t7 is unsigned" );

ETest6 e6 = (ETest6)-1;
if( t8 > e6 )   DBGPRINTF( "t8 is unsigned" );
else            DBGPRINTF( "t8 is signed" );
// Windows
t7 is signed
t8 is signed
// ARM
t7 is unsigned
u8 is signed

enum の列挙にマイナスの値を入れると、両方とも自動的に signed になるみたいですが(というか Windows は最初からから全部 signed int っぽい)、列挙にプラスの値しか入っていない状態でマイナスの値を入れると、ARM の場合は unsigned になってしまうみたいです。


自分の場合、普通に列挙しておいた値に対して無効な値である、という意味で -1 を入れたりするんですが、これのせいでやられましたorz