私は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+sCとsA+= 5はすべてshortで署名されているため、 intに昇格しないでください。
デフォルトでintにプロモートするとオーバーフローのバグが防止されることは理解していますが、コードのほとんどをキャストするか、変数をintに変更する必要があるため、少し面倒です。
この整数拡張スキームを提示するために使用できるGCCオプションはありますか?
ご協力いただきありがとうございます。