コンパイラが符号付き/符号なしの不一致を検出すると、どのような処理が行われますか?符号付き数値は符号なしか、またはその逆に変換されますか?なぜ?符号付き/符号なしの不一致が発生した場合のキャストは何ですか?
答えて
オペランドが整数で符号なしの値がある場合、符号なしの変換が行われます。例えば:
-1 > (unsigned int)1 // as -1 will be converted to 2^nbits-1
変換INT-> unsigned int型である:N> = 0 - > N。 n < 0 - > n(mod 2^nbits)、たとえば-1は2^nbits-1になります。
変換unsigned int-> intは:n < = INT_MAX - > nです。 N> INT_MAX - 宛先タイプが符号なしの場合>実装は
定義、 結果の値が ソース整数(モジュロ2^nは、nは 使用されるビットの数であると合同少なくとも 符号なし整数です。符号なしタイプ を表す)。
宛先タイプが署名されている場合は、宛先タイプ (およびビットフィールド幅)に を表すことができれば、 値は不変です。それ以外の場合、 の値は実装定義です。
これはコンパイラ固有のものです。 質問 "Should I disable the C compiler signed/unsigned mismatch warning?"を見ると、 "litb"の場合、signed-varの変数は符号なしの値に "昇格"していることがわかります。
いずれの場合でも、変数が特定の値に達すると(つまり、most significant bitが設定されている場合)、コンパイラがこの状況を処理するための「正しい」方法はありません。 そのような警告がある場合は、必ず除去してください;)
私はC++はCが署名/符号なしの変換を処理する方法から逸脱するとは思わない:unsigned
オペランドが含まれる場合
変換規則は より複雑です。 さまざまな整数 の種類に応じて の符号付き値と符号なし値の比較が のマシン依存であるため、問題があります。考慮すべき(K & R)
一つの重要な要因は、整数プロモーションに影響を与えるための種類の一つは、long
整数であるか否かです。例えば、long int
がunsigned int
と比較され、long int
がunsigned int
のすべての値を表すことができる場合、unsigned int
はlong int
に変換されます。
しかし、ほとんどの場合、コンパイラは、不一致が見つかると、符号付き整数を符号なし整数に変換する必要があります。
- 1. 符号付きNaN値
「なぜ?」:この標準では、5:9の「通常の算術変換」をカバーしています。その中のオペランドの型の間の唯一の違いが符号なしである場合、少し頭の傷を付けて、リストの4番目、5番目および8番目のルールは一緒に言います。 –