7

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

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

9 に答える 9

8

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

したがって、 for ループは決して終了しません。

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

于 2013-03-11T13:59:39.983 に答える
2

なんでそうなの?

あなたのプログラムには未定義の動作があるため(%dwhich is forintを出力するために使用unsigned)、何かが起こると予想できます。

なぜ無限ループ?anunsigned intは常に>= 0.

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

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

于 2013-03-11T14:00:50.107 に答える
2

%dフォーマット文字列は、置換された値をint署名付きのとして扱います。

于 2013-03-11T13:57:42.060 に答える
1

printf与えられた変数の型を知ることはできません。取得するのは値 (ビット自体) だけです。その値をどのように解釈するかを指示する必要があり%d、それを符号付き整数として解釈するように指示する必要があります。

于 2013-03-11T14:00:09.407 に答える
1

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

したがって、値が 10 から 0 の間、出力は問題ありません (109876543210)。その後、値は巨大な正 (最大値、32bit int の場合は0xFFFFFFFF) になります。0 との比較は true であるため、ループが続行されます。しかし、printf 0xFFFFFFFFプロデュース-1以来%d使用されています。その後、ループは0xFFFFFFFEwhich isに続きますが-2、まだ>= 0署名されていません。

を使用し%uます。

于 2013-03-11T13:58:56.830 に答える
0

符号付き整数の書式指定子である printf() で "%d" を使用しています。

于 2013-03-11T13:59:00.267 に答える
0

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

于 2013-03-11T13:59:50.467 に答える
0

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

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

于 2013-03-11T14:00:02.230 に答える
0

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

于 2013-03-11T14:01:25.030 に答える