JavaRush /Java Blog /Random-JA /プリミティブ型のキャスト。int から short および byte へのキャスト
Георгий
レベル 22
Санкт-Петербург

プリミティブ型のキャスト。int から short および byte へのキャスト

Random-JA グループに公開済み
プリミティブ型のキャスト。 int を short および byte にキャストする - 1int一部の型値を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。どのタイプ番号もint4 バイトまたは 32 ビットを占め、各ビットは 0 または 1 です。この場合、9 ビットのみが占有されており、原則としてint i = 450バイナリ システムでは次のようになります。

0000_0000_0000_0000_0000_0001_1100_0010
変数を type の変数に書き込みたいのbyteですが、型番号はbyte1 バイト (この型の名前からわかるように) または 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. 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
  2. 最も難しい部分は終わりました!インバース(逆)コードを受け取ったので、あとは直接コードを取得するだけです。すべての 0 を 1 に反転し、その逆も同様です。

    1100 0001- 逆コード;

    0011 1110 - 私たちの番号の直接コード、またはむしろその肯定的な表現。

  3. 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.

同様に、 type の数値はshorttype に変換されますint
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 第 10 記数法での 10,000,000 =0000 0000 1001 1000 1001 0110 1000 0000第 2 記数法で。

    Java では、型番号intは 4 バイト、型番short号は 2 バイト、つまり 16 ビットを必要とするため、左側を 16 桁に切り捨てます。

  2. 1001 0110 1000 0000。左端のビット (符号ビットとも呼ばれる最上位ビット) は 1 であることがわかりました。これは、負の数に対する追加のコードがあることを意味するため、次のポイントに進みます。
  3. これを逆コードに変換してみましょう。

    
    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;

  4. 反転して直接コードを取得します0110 1001 1000 0000

  5. 2 進数システムに変換し、数値の正の表現を取得します。

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. マイナスを追加すると答えが得られます。-27008

プリミティブ型のキャスト。 int を short および byte にキャストする - 2順方向、逆方向、および相補コードのオンライン計算機へのリンク。このサイトの電卓の下にも、逆符号と補符号に関するちょっとした理論があります。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION