3

次のプログラムは、符号付き/符号なしの不一致の警告を出します。

#include <iostream>

int main()
{
unsigned int a = 2;
int b = -2;

if(a < b)
    std::cout << "a is less than b!";

return 0;
}

符号付きintと符号なしintの混合に関して、問題を理解しようとしています。私が聞いたところによると、intは通常、2の補数を使用してメモリに格納されます。

それで、私が番号2を持っているとしましょう。私が理解していることに基づいて、それは次のようにメモリに表されます。

00000000 00000000 00000000 00000010

また、-2は、1の補数に1を加えたものとして表されます。または、次のようになります。

11111111 11111111 11111111 11111110

2つの褒め言葉で、「符号と大きさの方法」のような符号のために予約されたビットはありません。符号ビットがない場合、unsigned intがより大きな正の数を格納できるのはなぜですか?符号付き/符号なしintを混合するときに発生する可能性のある問題の例は何ですか?

4

5 に答える 5

6

符号付きintと符号なしintの混合に関して、問題を理解しようとしています。

a < b

通常の算術変換では、膨大な数のにb変換されます。unsigned int> a

ここでの式a < bは次のものと同じです。

2U < (unsigned int) -2これは次と同じです:

2U < UINT_MAX - 1(ほとんどの2の補数システムで)これは1(真)です。

2つの褒め言葉で、「符号と大きさの方法」のような符号のために予約されたビットはありません。

2の補数表現では、符号付き数量の最上位ビットがである場合1、その数は負になります。

于 2012-06-03T14:54:59.590 に答える
1

2 147 483 648の表現は何でしょうか?

10000000 00000000 00000000 00000000

-2 147 483 648の表現はどうなりますか?

10000000 00000000 00000000 00000000

同じ!したがって、違いを知るための規則が必要です。慣例では、最初のビットは引き続き符号を決定するために使用され、他の方法で使用する単純な符号の大きさの方法は使用されません。これは、すべての正の数が0で始まり、実際の数に31ビットだけが残ることを意味します。これにより、符号なし数値の正の範囲の半分が得られます。

コードに関するこの問題は、符号付き整数が符号なしに変換されることです。たとえば、-1は4 294 967 295になり(同じバイナリ表現を持ちます)、小さいのではなく、ゼロよりはるかに大きくなります。これはおそらくあなたが期待するものではありません。

于 2012-06-03T15:08:53.780 に答える
0

は、またはintであるかどうかに関係なく、2 ^ 32の異なる値(32ビットの場合)のみを格納できます。したがって、aは、その範囲の1/2がゼロより下にあり、その範囲の1/2がゼロより上にあります。Anは、ゼロより上の全範囲を持っています。signedunsignedsigned intunsigned int

彼らはsigned int「符号ビット」の最上位ビットを呼び出しませんが、そのように扱うことができます。

于 2012-06-03T14:55:35.287 に答える
0

これは(int)a <int(b)ほど簡単ではありませんか?明示的な型キャストを強く行う必要があるようなC++ではありませんか?

于 2012-06-04T18:35:15.943 に答える
-2

さて、signed intとしての-1は-1であり、unsigned intとしては65534であるため、問題は「-」が必要な符号付き値にあります。-1エラーコードを返す場合、unsignedintは65534コードになります。

于 2012-06-03T14:54:49.480 に答える