2009-05-08 16 views

答えて

3

オペランドが整数で符号なしの値がある場合、符号なしの変換が行われます。例えば:

-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は 使用されるビットの数であると合同少なくとも 符号なし整数です。符号なしタイプ を表す)。

宛先タイプが署名されている場合は、宛先タイプ (およびビットフィールド幅)に を表すことができれば、 値は不変です。それ以外の場合、 の値は実装定義です。

+1

「なぜ?」:この標準では、5:9の「通常の算術変換」をカバーしています。その中のオペランドの型の間の唯一の違いが符号なしである場合、少し頭の傷を付けて、リストの4番目、5番目および8番目のルールは一緒に言います。 –

0

これはコンパイラ固有のものです。 質問 "Should I disable the C compiler signed/unsigned mismatch warning?"を見ると、 "litb"の場合、signed-varの変数は符号なしの値に "昇格"していることがわかります。

いずれの場合でも、変数が特定の値に達すると(つまり、most significant bitが設定されている場合)、コンパイラがこの状況を処理するための「正しい」方法はありません。 そのような警告がある場合は、必ず除去してください;)

1

私はC++はCが署名/符号なしの変換を処理する方法から逸脱するとは思わない:unsignedオペランドが含まれる場合

変換規則は より複雑です。 さまざまな整数 の種類に応じて の符号付き値と符号なし値の比較が のマシン依存であるため、問題があります。考慮すべき(K & R)

一つの重要な要因は、整数プロモーションに影響を与えるための種類の一つは、long整数であるか否かです。例えば、long intunsigned intと比較され、long intunsigned intのすべての値を表すことができる場合、unsigned intlong intに変換されます。

しかし、ほとんどの場合、コンパイラは、不一致が見つかると、符号付き整数を符号なし整数に変換する必要があります。

関連する問題