11

C99標準のセクション6.3.1.1には、次のものが含まれています。

以下は、intまたは unsigned intが使用される可能性がある場合は常に、式で使用できます。

_Bool[...]タイプ、、、、 またはintのビットフィールド。signed intunsigned int

intが元のタイプのすべての値を表すことができる場合、値はint;に変換されます。それ以外の場合は、に変換されますunsigned int

これは、符号なしビットフィールドの幅がの幅と等しい場合を除いて、unsigned intビットフィールドがにプロモートされることを意味しているように思われます。この場合、最後のフレーズが適用されます。intint

私は次のプログラムを持っています:

struct S { unsigned f:32; } x = { 28349};

unsigned short us = 0xDC23L;

main(){
  int r = (x.f ^ ((short)-87)) >= us;
  printf("%d\n", r);
  return r;
}

そして、このプログラムを実行する2つのシステム(int両方のシステムで32ビット)。1つのシステムは、このプログラムが1を出力し、もう1つのシステムは0を出力すると言います。私の質問は、2つのシステムのどちらに対してバグレポートを提出する必要があるかということです。(上記の抜粋のため、0を出力するシステムに対してレポートを提出することに傾倒しています)

4

2 に答える 2

3

現在のドラフトで次の文が明確にされて以来、このあいまいさは標準化委員会によってすでに検出されているようです。

intが元のタイプのすべての値を表すことができる場合(ビットフィールドの場合、幅によって制限されます)、値はintに変換されます。

于 2011-05-12T19:19:29.660 に答える
1

私の読み方はあなたと同じです。intのサイズのunsignedビットフィールドは、型としてunsigned intを持っている必要があり、intに署名されているはずのintよりも小さい必要があります。

私がアクセスしたコンパイラー(x86のgcc、SparcのSun CC、POWERのIBM xlC)は、この読み取り値と一致する動作をします(プログラムで1を出力し、ビットフィールドが31ビットに削減されるか署名された場合は0を出力します)。

于 2011-05-12T12:11:32.137 に答える