以下のプログラムを実行している間、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);
}
以下のプログラムを実行している間、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);
}
符号なし整数は常に負ではなく、0 以上です。符号なし整数型で 0 から 1 を引くと、MAX_INT になります。
したがって、 for ループは決して終了しません。
ただし、符号付きの値ではなく符号なしの値を出力する場合は、printf で「%d」ではなく「%u」を使用する必要があります。
なんでそうなの?
あなたのプログラムには未定義の動作があるため(%d
which is forint
を出力するために使用unsigned
)、何かが起こると予想できます。
なぜ無限ループ?anunsigned int
は常に>= 0
.
符号なし整数の概念は何ですか?
それは...符号なし整数です。負でない整数。
%d
フォーマット文字列は、置換された値をint
署名付きのとして扱います。
printf
与えられた変数の型を知ることはできません。取得するのは値 (ビット自体) だけです。その値をどのように解釈するかを指示する必要があり%d
、それを符号付き整数として解釈するように指示する必要があります。
を使用する%d
ため、printf は値を符号付きとして解釈します。unsigned のゼロ (>=0) との比較は常に true です。
したがって、値が 10 から 0 の間、出力は問題ありません (109876543210)。その後、値は巨大な正 (最大値、32bit int の場合は0xFFFFFFFF
) になります。0 との比較は true であるため、ループが続行されます。しかし、printf
0xFFFFFFFF
プロデュース-1
以来%d
使用されています。その後、ループは0xFFFFFFFE
which isに続きますが-2
、まだ>= 0
署名されていません。
を使用し%u
ます。
符号付き整数の書式指定子である printf() で "%d" を使用しています。
printf でフォーマット指定子%u
として使用する必要があります。使用しない場合、値は にキャストされます。int
この宣言unsigned integer
は、変数に対して符号なし操作を使用するようにコンパイラに指示します。たとえば、>>
演算子は、符号なし整数と符号付き整数で異なる動作をします (具体的には、符号ビットを保持する必要があるかどうか)。
符号なし整数を出力するには、%u
フォーマットを使用する必要があります。
符号付き整数 (16 ビットを使用します) の範囲は -32768 から 32767 (0x8000 から 0x7FFF) ですが、符号なし整数の範囲は 0 から 65535 (0x0000 から 0xFFFF) です。したがって、符号なし整数に負の値を指定することはできません。これが、ループが終了しない理由です。ただし、出力で数値が負の値としてフォーマットされていることがわかるように、出力を符号付き ( ) であるかのようにフォーマットするように印刷プログラムに指示しています。あるレベルでは、コンピューター内のすべては解釈が必要な単なるビットの文字列であり、コード例では同じビット パターンの 2 つの異なる解釈を使用しています... unsigned int.%d