JavaRush /Java Blog /Random-ID /Mentransmisikan tipe primitif. Mentransmisikan int ke sho...
Георгий
Level 22
Санкт-Петербург

Mentransmisikan tipe primitif. Mentransmisikan int ke short dan byte

Dipublikasikan di grup Random-ID
Mentransmisikan tipe primitif.  Mentransmisikan int ke short dan byte - 1Mengapa jika Anda memasukkan beberapa nilai tipe intke type shortatau byte, hasilnya tidak terduga? Mari kita cari tahu!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Hasil di layar:

-62
Di luar dugaan, ada penjelasan logisnya, apalagi tindakan ini bisa dilakukan dengan tangan Anda sendiri. Untuk melakukan ini, kita perlu mengubah 450 dari desimal ke biner:

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
Pada kolom sebelah kanan bilangan tersebut kita tuliskan sisanya bila dibagi 2, dan di bawah bilangan itu sendiri kita tuliskan hasil pembagian bilangan kita dengan dua, jika sisanya 0. Jika sisanya 1, maka di bawahnya kita tuliskan bagian bilangan bulat dari pembagian dua. ( Kalkulator online dengan penjelasan perhitungannya ). Hasilnya, kita mendapatkan bahwa dalam sistem bilangan biner 450 = 11100 0010. Nomor tipe apa pun intmenempati 4 byte atau 32 bit, di mana setiap bit adalah 0 atau 1. Dalam kasus kami, hanya 9 bit yang ditempati, dan pada prinsipnya milik kami int i = 450dalam sistem biner terlihat seperti ini:

0000_0000_0000_0000_0000_0001_1100_0010
Kita ingin menulis variabel kita ke dalam variabel bertipe byte, tetapi nomor tipenya bytemembutuhkan 1 byte (sebagai berikut dari nama tipe ini) atau 8 bit. Oleh karena itu, bit tambahan di sebelah kiri dibuang begitu saja, dan pada akhirnya kita mendapatkan:

1100 0010
Kisaran nilai tipe byte: -128 hingga 127. Setiap angka menempati 8 bit dan bit paling kiri dari setiap angka adalah bit tanda. Untuk semua bilangan positif sama dengan 0, untuk semua bilangan negatif sama dengan 1. Tidak perlu terburu-buru untuk mengubah hasil yang kita peroleh di atas ke dalam sistem ke-10, karena kami menerima kode tambahan untuk nomor yang diinginkan, dan bukan kode langsung. Bit paling kiri ternyata sama dengan 1, oleh karena itu bilangan kita negatif, dan untuk bilangan negatif kode maju dan mundur tidak sama, tidak seperti bilangan positif. Jika bit tanda sama dengan 0, maka kita dapat langsung mengubah bilangan tersebut ke sistem bilangan desimal dan mendapatkan: 66. Tetapi bit tandanya negatif, jadi pertama-tama kita perlu mengubah kode tambahan menjadi kode langsung dan menambahkan minus menandatangani jawabannya. Untuk kejelasan dan pelatihan, pertama-tama mari kita coba mendapatkan kode tambahan dari beberapa nomor, misalnya -15. Untuk melakukan ini, dalam kode langsung dari representasi positifnya (angka 15), Anda perlu mengubah semua angka 0 menjadi 1 dan sebaliknya (dapatkan kode kebalikannya, juga disebut terbalik), lalu menambahkan satu ke hasilnya. Dalam sistem desimal 15 = 0000 1111; Kode terbalik (ubah semua 0 menjadi 1 dan sebaliknya) = 1111 0000; Kode tambahan (tambahkan 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
Kode tambahan untuk nomor -15: 1111 0001; Bagus. Sekarang, dengan analogi dengan contoh di atas, kita perlu mengubah kode tambahan kita menjadi kode langsung; izinkan saya mengingatkan Anda, itu sama dengan 1100 0010.
  1. Kurangi satu dan dapatkan kode sebaliknya. Lebih mudah untuk melakukan ini, tuliskan kode tambahan dalam jawaban dan lihat apa yang perlu Anda tambahkan untuk mendapatkan kode tambahan tersebut. Kita mulai dengan angka paling kanan dan lihat: apa yang perlu kita tambahkan 1 untuk mendapatkan 0? Untuk 1, kita mendapatkan 10, 0 sebagai respons, dan 1 untuk digit berikutnya. Selanjutnya apa yang perlu ditambahkan ke 0 untuk mendapatkan satu. Satu, tapi karena kita punya satu dari digit sebelumnya, kita tuliskan 0. Selanjutnya, untuk mendapatkan 0, apa yang harus kita tambahkan ke 0? Tentu saja 0. Jadi 4 kali lagi. Dan masih ada 2 digit terakhir yang tersisa, di mana Anda perlu menambahkan sesuatu ke 0 untuk mendapatkan 1. Tentu saja, dalam kedua kasus tersebut Anda perlu menambahkan 1. Total:

    
    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. Bagian tersulit telah berakhir! Kita sudah mendapatkan kode inverse (terbalik) dan yang harus kita lakukan hanyalah mendapatkan kode langsungnya. Kami membalikkan semua 0 ke 1 dan sebaliknya:

    1100 0001- kode terbalik;

    0011 1110 - kode langsung nomor kami, atau lebih tepatnya representasi positifnya;

  3. Konversi ke sistem bilangan desimal ( Kalkulator online dengan penjelasan perhitungannya ):

    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;

    Yang tersisa hanyalah menambahkan tanda minus pada nomor tersebut dan jawaban kami:-62.

Dengan cara yang sama, angka bertipe diubah shortmenjadi tipe int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10.000.000 pada sistem bilangan ke-10 = 0000 0000 1001 1000 1001 0110 1000 0000pada sistem bilangan ke-2.

    Di Java, nomor tipe intmembutuhkan 4 byte, dan shortnomor tipe membutuhkan 2 byte, atau 16 bit, jadi kami memotong bagian kiri menjadi 16 digit:

  2. 1001 0110 1000 0000. Bit paling kiri (bit paling signifikan, disebut juga bit tanda) ternyata sama dengan 1. Artinya kita mempunyai kode tambahan untuk bilangan negatif, jadi kita lanjutkan ke poin berikutnya.
  3. Mari kita terjemahkan ke dalam kode 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

    Kode pengembalian: 1001 0110 0111 1111;

  4. Kami membalikkan dan mendapatkan kode langsung: 0110 1001 1000 0000.

  5. Kami mengonversi ke sistem bilangan biner dan mendapatkan representasi positif dari bilangan kami:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Tambahkan minus dan dapatkan jawabannya:-27008

Mentransmisikan tipe primitif.  Mentransmisikan int ke short dan byte - 2Tautan ke kalkulator online kode maju, mundur, dan komplementer. Juga di situs kalkulator ini terdapat sedikit teori tentang kode invers dan komplemen.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION