JavaRush /Blog Java /Random-MS /Casting jenis primitif. Menghantar int ke pendek dan bait...
Георгий
Tahap
Санкт-Петербург

Casting jenis primitif. Menghantar int ke pendek dan bait

Diterbitkan dalam kumpulan
Casting jenis primitif.  Menghantar int ke pendek dan bait - 1Mengapakah jika anda menghantar beberapa nilai jenis intuntuk menaip shortatau byte, hasilnya tidak dijangka? Jom ketahui!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Keputusan pada skrin:

-62
Tanpa diduga, terdapat penjelasan logik untuk ini, lebih-lebih lagi, tindakan ini boleh dilakukan dengan tangan anda sendiri. Untuk melakukan ini, kita perlu menukar 450 daripada perpuluhan kepada binari:

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
Di lajur kanan nombor kita tulis bakinya apabila dibahagikan dengan 2, dan di bawah nombor itu sendiri kita tulis hasil pembahagian nombor kita dengan dua, jika bakinya ialah 0. Jika bakinya ialah 1, maka di bawah kita tuliskan bahagian integer daripada bahagi dengan dua. ( Kalkulator dalam talian dengan penjelasan pengiraan ). Akibatnya, kita mendapat bahawa dalam sistem nombor binari 450 = 11100 0010. Sebarang jenis nombor intmenduduki 4 bait atau 32 bit, di mana setiap bit adalah 0 atau 1. Dalam kes kami, hanya 9 bit yang diduduki, dan pada dasarnya kami int i = 450dalam sistem binari kelihatan seperti ini:

0000_0000_0000_0000_0000_0001_1100_0010
Kami ingin menulis pembolehubah kami ke dalam pembolehubah type byte, tetapi nombor jenis bytemengambil 1 bait (seperti berikut dari nama jenis ini) atau 8 bit. Oleh itu, bit tambahan di sebelah kiri hanya dibuang, dan pada akhirnya kita mendapat:

1100 0010
Jenis julat nilai byte: -128 hingga 127. Setiap nombor menduduki 8 bit dan bit paling kiri bagi setiap nombor ialah bit tanda. Untuk semua nombor positif ia adalah sama dengan 0, untuk semua nombor negatif ia adalah sama dengan 1. Tidak perlu tergesa-gesa untuk menukar keputusan kami yang diperolehi di atas ke dalam sistem ke-10, kerana kami menerima kod tambahan untuk nombor yang dikehendaki, dan bukan kod langsung. Bit paling kiri ternyata sama dengan 1, oleh itu nombor kami adalah negatif, dan untuk nombor negatif kod langsung dan terbalik tidak bertepatan, tidak seperti yang positif. Jika bit tanda adalah sama dengan 0, maka kita boleh segera menukar nombor itu kepada sistem nombor perpuluhan dan mendapatkan: 66. Tetapi bit tanda adalah negatif, jadi pertama kita perlu menukar kod tambahan menjadi kod langsung dan menambah tolak tandakan jawapan. Untuk kejelasan dan latihan, mula-mula mari cuba dapatkan kod tambahan beberapa nombor, contohnya -15. Untuk melakukan ini, dalam kod langsung perwakilan positifnya (nombor 15), anda perlu menukar semua 0s kepada 1s dan sebaliknya (dapatkan kod terbalik, juga dipanggil songsang), dan kemudian tambah satu pada hasilnya. Dalam sistem perpuluhan 15 = 0000 1111; Kod songsang (tukar semua 0s kepada 1s dan sebaliknya) = 1111 0000; Kod tambahan (tambah satu):

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Kod tambahan untuk nombor -15: 1111 0001; Hebat. Sekarang, dengan analogi dengan contoh di atas, kita perlu menukar kod tambahan kami kepada kod langsung; biar saya ingatkan anda, ia sama dengan 1100 0010.
  1. Tolak satu dan dapatkan kod terbalik. Adalah mudah untuk melakukan ini, tuliskan kod tambahan dalam jawapan dan lihat perkara yang anda perlu tambahkan untuk mendapatkan kod tambahan tersebut. Kita mulakan dengan digit paling kanan dan lihat: apakah yang perlu kita tambah 1 untuk mendapatkan 0? Untuk 1, kita mendapat 10, 0 pergi sebagai tindak balas, dan 1 pergi ke digit seterusnya. Seterusnya, apa yang perlu ditambah kepada 0 untuk mendapatkan satu. Satu, tetapi kerana kita mempunyai satu daripada digit sebelumnya, kita menulis 0 sebagai jawapan. Seterusnya, untuk mendapatkan 0, apakah yang perlu kita tambah kepada 0? Sudah tentu, 0. Jadi 4 kali lagi. Dan terdapat 2 digit terakhir yang tinggal, di mana anda perlu menambah sesuatu kepada 0 untuk mendapatkan 1. Sudah tentu, dalam kedua-dua kes anda perlu menambah 1. Jumlah:

    
    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. Bahagian yang paling sukar telah berakhir! Kami telah menerima kod songsang (terbalik) dan apa yang perlu kami lakukan ialah mendapatkan kod langsung. Kami terbalikkan semua 0 kepada 1 dan sebaliknya:

    1100 0001- kod songsang;

    0011 1110 - kod langsung nombor kami, atau sebaliknya perwakilan positifnya;

  3. Tukar kepada sistem nombor perpuluhan ( Kalkulator dalam talian dengan penjelasan pengiraan ):

    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;

    Apa yang tinggal ialah menambah tolak pada nombor dan jawapan kami:-62.

Dengan cara yang sama, bilangan jenis ditukar shortkepada jenis int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10,000,000 dalam sistem nombor ke-10 = 0000 0000 1001 1000 1001 0110 1000 0000dalam sistem nombor ke-2.

    Di Java, nombor jenis intmengambil 4 bait, dan shortnombor jenis mengambil 2 bait, atau 16 bit, jadi kami memotong sebelah kiri kepada 16 digit:

  2. 1001 0110 1000 0000. Bit paling kiri (bit paling ketara, juga dikenali sebagai bit tanda) ternyata sama dengan 1. Ini bermakna kita mempunyai kod tambahan untuk nombor negatif, jadi kita beralih ke titik seterusnya.
  3. Mari terjemahkannya ke dalam kod terbalik:

    
    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

    Kod pemulangan: 1001 0110 0111 1111;

  4. Kami terbalikkan dan dapatkan kod langsung: 0110 1001 1000 0000.

  5. Kami menukar kepada sistem nombor binari dan mendapatkan perwakilan positif nombor kami:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Tambah tolak dan dapatkan jawapannya:-27008

Casting jenis primitif.  Menghantar int ke pendek dan bait - 2Pautan ke kalkulator dalam talian bagi kod hadapan, belakang dan pelengkap. Juga di laman web ini di bawah kalkulator terdapat sedikit teori tentang kod songsang dan pelengkap.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION