int
一部の型値をtypeshort
またはにキャストするとbyte
、予期しない結果が得られるのはなぜですか? 確認してみましょう!
int i = 450;
byte b = (byte)i;
System.out.println(b);
画面上の結果:
-62
意外なことに、これには論理的な説明があり、さらに、このアクションは自分の手で行うことができます。これを行うには、450 を 10 進数から 2 進数に変換する必要があります。
450/2. 0
225/2. 1
112/2. 0
56/2. 0
28/2. 0
14/2. 0
7/2. 1
3/2. 1
1/2. 1
数値の右の列には、2で割ったときの余りを書き、その数値の下には、余りが0の場合、数値を2で割った結果を書きます。余りが1の場合、以下を書きます。 2で割った整数部分。(計算の説明付きのオンライン計算機)。結果として、2 進数系では 450 = となります11100 0010
。どのタイプ番号もint
4 バイトまたは 32 ビットを占め、各ビットは 0 または 1 です。この場合、9 ビットのみが占有されており、原則としてint i = 450
バイナリ システムでは次のようになります。
0000_0000_0000_0000_0000_0001_1100_0010
変数を type の変数に書き込みたいのbyte
ですが、型番号はbyte
1 バイト (この型の名前からわかるように) または 8 ビット必要です。したがって、左側の余分なビットは単純に破棄され、最終的には次のようになります。
1100 0010
タイプ値の範囲byte
: -128 ~ 127。各数値は 8 ビットを占め、各数値の左端のビットは符号ビットです。すべての正の数については 0 に等しく、すべての負の数については 1 に等しくなります。上記で得られた結果を急いで 10 番目のシステムに変換する必要はありません。直接のコードではなく、希望の番号の追加コードを受け取りました。左端のビットは 1 であることが判明したため、数値は負であり、負の数値の場合、正の場合とは異なり、直接コードと逆コードは一致しません。符号ビットが 0 に等しい場合、すぐに数値を 10 進数に変換して 66 を得ることができます。しかし、符号ビットは負なので、最初に追加のコードを直接コードに変換し、マイナスを追加する必要があります。答えにサインします。わかりやすくし、トレーニングするために、まず、ある数値 (-15 など) の追加コードを取得してみます。これを行うには、その正の表現の直接コード (番号 15) で、すべての 0 を 1 に、またはその逆に変更し (逆コードとも呼ばれる逆コードを取得)、結果に 1 を加算する必要があります。10 進法では 15 = 0000 1111
; コードを逆にします (すべての 0 を 1 に、またはその逆に変更します) = 1111 0000
; 追加コード (1 つ追加):
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
数値 -15 の追加コード: 1111 0001
; さて、上記の例から類推すると、追加のコードを直接コードに変換する必要があります。念のため言っておきますが、これは と等しいです1100 0010
。
-
1 を引くと逆のコードが得られます。これを行うと便利です。回答に追加のコードを書き留めて、そのような追加のコードを取得するには何にコードを追加する必要があるかを確認します。右端の数字から始めて、0 を得るには何に 1 を足す必要があるかを見てみます。1 に対して 10 が返され、0 が応答し、1 が次の桁に進みます。次に、1 を得るには 0 に何を加算する必要があります。1 ですが、前の桁の 1 があるので、応答として 0 を書きます。次に、0 を得るには、0 に何を加えればよいでしょうか。もちろん 0 です。つまり、あと 4 回です。そして最後の 2 桁が残っており、1 を得るには 0 に何かを加える必要があります。もちろん、どちらの場合も 1 を加える必要があります。合計:
1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
-
最も難しい部分は終わりました!インバース(逆)コードを受け取ったので、あとは直接コードを取得するだけです。すべての 0 を 1 に反転し、その逆も同様です。
1100 0001
- 逆コード;0011 1110
- 私たちの番号の直接コード、またはむしろその肯定的な表現。 -
10 進数システムに変換します (計算の説明付きのオンライン計算機):
0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;
残っているのは、数字と答えにマイナスを加えるだけです。
-62.
short
type に変換されますint
。
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
-
第 10 記数法での 10,000,000 =
0000 0000 1001 1000 1001 0110 1000 0000
第 2 記数法で。Java では、型番号
int
は 4 バイト、型番short
号は 2 バイト、つまり 16 ビットを必要とするため、左側を 16 桁に切り捨てます。 -
これを逆コードに変換してみましょう。
1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
戻りコード:
1001 0110 0111 1111
; -
反転して直接コードを取得します
0110 1001 1000 0000
。 -
2 進数システムに変換し、数値の正の表現を取得します。
1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
-
マイナスを追加すると答えが得られます。
-27008
1001 0110 1000 0000
。左端のビット (符号ビットとも呼ばれる最上位ビット) は 1 であることがわかりました。これは、負の数に対する追加のコードがあることを意味するため、次のポイントに進みます。
GO TO FULL VERSION