の場合signed integer
、左端のビットが符号を設定するため、このタイプ要素が持つことができる値の範囲は-2147483648〜2147483647です。正の値から負の値を取得するには、すべてのビットに対してビットを逆にし、その逆も行います。
の場合unsigned integer
、左端のビットは追加の値を格納するために使用されます。したがって、このタイプ要素が持つことができる値の範囲は0〜4294967295です。
バイナリ形式でi=1;
はi = i*2;
、値として実行できるのは次のとおりです。
1 // 1 in base 10
10 // 2 in base 10
100 // 4 in base 10
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
10000000000000000000
100000000000000000000
1000000000000000000000
10000000000000000000000
100000000000000000000000
1000000000000000000000000
10000000000000000000000000
100000000000000000000000000
1000000000000000000000000000
10000000000000000000000000000
100000000000000000000000000000
1000000000000000000000000000000 // 1073741824 in base 10
10000000000000000000000000000000 // 2147483648 in base 10
while (i > 0) {
ここで、:のようなループがありi
、前述のように動作する場合、0になることはないため、無限ループになります。オーバーフローは発生しますが、プログラムにブレーキはかかりません。引き続き実行されます。
変数i
が符号付きの場合(デフォルト)、c=32
整数10000000000000000000000000000000が-2147483648と評価され、つまり。として出力され< 0
ます。ただし、この場合、出力はわかりません。
それは学業であるため、当然のことながら、教師は問題を選択しました。そこでは、提供されたコードを実行することから何も結論付けることができません。これは、下にある型がどのように格納されているか、および符号付き型と符号なし型の違いを知ってほしいからだと思います。
余計な事実として、Javaには符号なしプリミティブや不変の数値クラスがありません。それらを持たないことは、場合によっては苦痛になる可能性があります。間違いなく便利なキーワードです。