Renesas Synergy™

FAQ 1008037 : 符号付きの型として宣言されたビット・フィールドについて

typedef union {
            struct{
                       char b_0 :1 ;
                       char b_1 :1 ;
                       char b_2 :1 ;
                       char b_3 :1 ;
                       char b_4 :1 ;
                       char b_5 :1 ;
                       char b_6 :1 ;
                       char b_7 :1 ;
            }FLG;
            char all;
}RAM;

RAM D_swptr;

if (D_swptr.FLG.b_0 == 1) {
            xxxx;
}

上記ソースをコンパイルしたところ、以下のアセンブラ・コードが出力されました。

ld.b -0x7c7b[gp], r10 -- r10=1の場合
shl 0x1f, r10 -- r10=0x80000000
sar 0x1f, r10 -- この時点でr10=0xffffffff になってしまう
cmp 0x1, r10 -- 当然、偽の判定になる

sar 命令の後で、cmp命令で比較をしており、 当然、偽の判定になりますが、ここで、sar命令が出力されるのは正しいのですか?
変数の型を unsigned charにした場合は、tst1命令が正常に出力されています。

 

回答

CA850では、符号付きの型として宣言された ビット・フィールドに対しては、 最上位ビットは符号ビットとなります。
詳細については、ユーザーズ・マニュアル C言語編の「コンパイル実行時の環境について」の 「ビットフィールド」を参照してください。

この場合、定義が"符号付き"の型(この場合にはchar型)で行われているために、 符号拡張するコードが出力されます。
そのため、1が入っている場合には、-1として扱われます。

符号なしの型として定義した場合には、 最上位ビットが符号として扱われないため、 tst1命令が出力されます。

 

 

適用製品

V850用コンパイラパッケージ [CA850]

 

他にご質問がございましたら、リクエストを送信してください