web-dev-qa-db-ja.com

Cの符号なし整数

以下のプログラムを実行している間、109876543210-1-2-3-4-5-6-78-9-10-11-12-とs0のように出力されます。なぜそうなのか?符号なし整数の概念は何ですか?

 main ()
   {
      unsigned int i;
       for (i = 10; i >= 0; i--)
                 printf ("%d", i);
   }
6
amitshree

符号なし整数は常に負ではなく、0以上です。符号なし整数型で0から1を引くと、MAX_INTになります。

したがって、forループが終了することはありません。

ただし、符号付きの値ではなく符号なしの値を出力する場合は、printfで「%d」ではなく「%u」を使用する必要があります。

6
Vicky

%d format stringは、置換された値をintとして扱います。これは署名されています。

2
David Heffernan

なぜそうなのか?

プログラムの動作が未定義であるため(intunsignedを出力するための%dを使用)-何が起こるかを期待できます。

なぜ無限ループなのか? unsigned intは常に>= 0だからです。

符号なし整数の概念は何ですか?

それは...符号なし整数です。負ではない整数。

2
user529758

%dを使用するため、printfは値を符号付きとして解釈します。符号なしのゼロ(> = 0)との比較は常に真です。

したがって、値は10から0ですが、出力は問題ありません(109876543210)。その後、値は非常に正になります(最大値、32ビット整数の場合は0xFFFFFFFF)。 0との比較は真なので、ループは続行されます。ただし、printfでは、0xFFFFFFFFが使用されるため、-1%dを生成します。次に、ループは0xFFFFFFFEに続きます。これは-2ですが、符号なしとして>= 0のままです。

%uを使用します。

1
Aneri

printfは、指定した変数のタイプを知ることができません。取得するのは値(ビット自体)だけです。その値を解釈する方法を指示する必要があり、%dを使用して、符号付き整数として解釈するように指示します。

1
nemetroid

符号付き整数のフォーマット指定子であるprintf()で「%d」を使用しています。

0
Andreas Fester

Printfでは%uフォーマット指定子 として使用する必要があります。そうしないと、値がintにキャストされます。

0
Dan

宣言unsigned integerは、変数に対して符号なし演算を使用するようにコンパイラーに指示します。たとえば、>>演算子は、符号なし整数と符号付き整数で異なる動作をします(具体的には、符号ビットを保持する必要があるかどうか)。

符号なし整数を出力するには、%uフォーマットを使用する必要があります。

0
onon15

符号付き整数(16ビットを使用)の範囲は-32768〜32767(0x8000〜0x7FFF)で、符号なし整数の範囲は0〜65535(0x0000〜 0xFFFF)。したがって、符号なし整数に負の値を設定することはできません。そのため、ループは終了しません。ただし、出力のようにフォーマットするように印刷プログラムに指示しました署名済み%d)出力に負の値としてフォーマットされた数値が表示されるようにします。あるレベルでは、コンピューター内のすべては解釈が必要なビットの文字列であり、コード例では同じビットパターンの2つの異なる解釈を使用しています... unsignedint。

0
Steve Valliere