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