2

私はGCCv4.4.5を使用していますが、予期していなかったデフォルトの整数拡張スキームに気づきました。

暗黙のバグを防ぐのに十分な警告をアクティブにするために、オプション-Wconversionをアクティブにしました。それ以降、以下のコードを実行すると、「「int」から「shortint」に変換すると値が変わる可能性があります」という警告が表示されます。

signed short sA, sB=1, sC=2;
sA = sB + sC;

これは、「sB + sC」intにプロモートされてから、shortで署名されたsAに割り当てられることを意味します。この警告を修正するには、このようにキャストする必要があります。

signed short sA, sB=1, sC=2;
sA = ( signed short )( sB + sC );

この警告は、以下のコードにも含まれています。

signed short sA=2;
sA += 5;

そして、これによって演算子+=を削除することで修正できます...

sA = ( signed short )( sA + 1 );

これは少し厄介な原因です。演算子+=-=を使用できません。

GCCがオペランドに応じて正しい汎整数拡張を選択することを期待していました。つまり、sA = sB+sCsA+= 5はすべてshortで署名されているため、 intに昇格しないでください。

デフォルトでintにプロモートするとオーバーフローのバグが防止されることは理解していますが、コードのほとんどをキャストするか、変数をintに変更する必要があるため、少し面倒です。

この整数拡張スキームを提示するために使用できるGCCオプションはありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

2

これは gcc ではなく、標準の C セマンティクスです。

6.3.1.1:2 に従って、整数変換ランクが int および unsigned int のランク以下である整数型のオブジェクトまたは式は、算術式に参加する前に、型の符号に応じて変換されます。 .intunsigned int

C がこのように動作する理由は、サブintタイプでの ALU 操作が完全なタイプでの操作よりも効率的でないプラットフォームを考慮に入れるためですint。値に対してすべての算術演算を実行し、保存のためにのみint元に戻す必要があります。short

于 2012-06-25T10:15:38.620 に答える