コンパイラが符号付き/符号なしの不一致を検出すると、どのような処理が行われますか?符号付き数値は符号なしか、またはその逆に変換されますか?なぜ?符号付き/符号なしの不一致が発生した場合のキャストは何ですか?
答えて
オペランドが整数で符号なしの値がある場合、符号なしの変換が行われます。例えば:
-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. 裸の `char32_t`は符号付きか符号なしですか?
- 2. 万一のCbCr値は、符号付きまたは符号なしこと
- 3. 符号なしの符号付き変換をJavaで逆
- 4. 符号付きバイトを符号なしハーフバイトにする
- 5. JNLP:符号付きコード内に符号なしコードをロード
- 6. 符号付き16進数減算対符号なし
- 7. オーディオPCMサンプルの符号なしshortを符号付きshortに変換する
- 8. 型キャスト符号なしロングロングC
- 9. 8ビット符号なしPCMを8ビット符号付きPCMに変換
- 10. 符号なし整数から符号付き整数への変換または逆の変換
- 11. msvcデータ型の単語は符号付きか符号なしですか? 32ビットマシン上
- 12. 符号付きNaN値
- 13. Cのモジュラス演算子で符号なしオーバーフローが発生しました
- 14. 2つの16ビット符号付きバイトから符号付き整数を取得しますか?
- 15. VHDL numeric_stdのオーバーフローが符号付き/符号なしで定義されています
- 16. VSコンパイラは符号付き/符号なし割り当てをキャッチしますか?
- 17. 符号付き文字配列を符号なし整数に変換できますか?
- 18. 符号なしIntのオーバーフロー
- 19. /符号なしの比較
- 20. 符号化なしのビネットエフェクト
- 21. nposが-1の場合、size_typeは符号なし積分になりますか?
- 22. ptrdiff_tの符号なしの対応は何ですか?
- 23. readOGRを使用した場合のドイツ語ウムラントの符号化
- 24. ハフマン符号化のトラバーサル符号化
- 25. リフレクションを使用して、符号付きアセンブリから符号なしアセンブリの型を読み込むことができるのはなぜですか?
- 26. C++の符号なし整数と符号なし整数の違い
- 27. 固定長符号化を生成するハフマン符号
- 28. Winsock2.h:FD_SET:符号付きと符号なし整数式との比較winsock2.hから
- 29. iPhone - 文字列を符号なしの文字にキャストする
- 30. C++の符号付きビットフィールド14
「なぜ?」:この標準では、5:9の「通常の算術変換」をカバーしています。その中のオペランドの型の間の唯一の違いが符号なしである場合、少し頭の傷を付けて、リストの4番目、5番目および8番目のルールは一緒に言います。 –