JavaRush /Java Blog /Random-TL /Pag-cast ng mga primitive na uri. Nag-cast ng int sa maik...
Георгий
Antas
Санкт-Петербург

Pag-cast ng mga primitive na uri. Nag-cast ng int sa maikli at byte

Nai-publish sa grupo
Pag-cast ng mga primitive na uri.  Nag-cast ng int sa maikli at byte - 1Bakit kung naglagay ka ng ilang uri ng mga halaga intupang i-type shorto byte, ang mga resulta ay hindi inaasahan? Alamin Natin!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Resulta sa screen:

-62
Sa hindi inaasahan, mayroong isang lohikal na paliwanag para dito, bukod dito, ang aksyon na ito ay maaaring gawin sa iyong sariling mga kamay. Upang gawin ito, kailangan nating i-convert ang 450 mula sa decimal patungo sa binary:

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
Sa kanang hanay ng numero ay isusulat namin ang natitira nito kapag hinati ng 2, at sa ilalim ng numero mismo ay isinusulat namin ang resulta ng paghahati ng aming numero sa dalawa, kung ang natitira ay 0. Kung ang natitira ay 1, pagkatapos ay isusulat namin sa ibaba ang integer na bahagi mula sa paghahati ng dalawa. ( Online na calculator na may paliwanag ng mga kalkulasyon ). Bilang resulta, nakukuha natin iyon sa binary number system 450 = 11100 0010. Ang anumang uri ng numero intay sumasakop sa 4 byte o 32 bits, kung saan ang bawat bit ay 0 o 1. Sa aming kaso, 9 bits lamang ang inookupahan, at sa prinsipyo ang sa amin int i = 450sa binary system ay ganito ang hitsura:

0000_0000_0000_0000_0000_0001_1100_0010
Gusto naming isulat ang aming variable sa isang variable ng type byte, ngunit ang type number byteay tumatagal ng 1 byte (tulad ng sumusunod mula sa pangalan ng ganitong uri) o 8 bits. Samakatuwid, ang mga dagdag na piraso sa kaliwa ay itinapon lamang, at sa huli ay nakukuha natin:

1100 0010
Uri ng hanay ng halaga byte: -128 hanggang 127. Ang bawat numero ay sumasakop ng 8 bits at ang pinakakaliwang bit ng bawat numero ay ang sign bit. Para sa lahat ng positibong numero ito ay katumbas ng 0, para sa lahat ng negatibong numero ito ay katumbas ng 1. Hindi na kailangang magmadali upang i-convert ang aming resulta na nakuha sa itaas sa ika-10 na sistema, dahil nakatanggap kami ng karagdagang code para sa gustong numero, at hindi direktang isa. Ang pinakakaliwa na bit ay naging katumbas ng 1, samakatuwid ang aming numero ay negatibo, at para sa mga negatibong numero ang direkta at baligtad na mga code ay hindi nag-tutugma, hindi katulad ng mga positibo. Kung ang sign bit ay katumbas ng 0, pagkatapos ay maaari naming agad na i-convert ang numero sa decimal na sistema ng numero at makakuha ng: 66. Ngunit ang sign bit ay negatibo, kaya kailangan muna naming i-convert ang karagdagang code sa isang direktang isa at magdagdag ng isang minus sign sa sagot. Para sa kalinawan at pagsasanay, subukan muna nating makuha ang karagdagang code ng ilang numero, halimbawa -15. Upang gawin ito, sa direktang code ng positibong representasyon nito (numero 15), kailangan mong baguhin ang lahat ng 0s sa 1s at vice versa (kunin ang reverse code, tinatawag ding inverse), at pagkatapos ay magdagdag ng isa sa resulta. Sa sistema ng decimal 15 = 0000 1111; Baliktarin ang code (baguhin ang lahat ng 0s sa 1s at vice versa) = 1111 0000; Karagdagang code (magdagdag ng isa):

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Karagdagang code para sa numero -15: 1111 0001; Mahusay. Ngayon, sa pamamagitan ng pagkakatulad sa halimbawa sa itaas, kailangan naming i-convert ang aming karagdagang code sa direktang code; hayaan mong ipaalala ko sa iyo, ito ay katumbas ng 1100 0010.
  1. Magbawas ng isa at kunin ang reverse code. Maginhawang gawin ito, magsulat ng karagdagang code sa sagot at tingnan kung ano ang kailangan mong idagdag para makakuha ng ganoong karagdagang code. Magsisimula tayo sa pinakakanang digit at tingnan: ano ang kailangan nating idagdag ng 1 upang makakuha ng 0? Sa 1, makakakuha tayo ng 10, 0 ang napupunta bilang tugon, at ang 1 ay napupunta sa susunod na digit. Susunod, kung ano ang kailangang idagdag sa 0 upang makakuha ng isa. Isa, ngunit dahil mayroon tayong isa mula sa nakaraang digit, isinusulat natin ang 0 bilang tugon. Susunod, upang makakuha ng 0, ano ang dapat nating idagdag sa 0? Siyempre, 0. Kaya 4 pang beses. At may natitira pang huling 2 digit, kung saan kailangan mong magdagdag ng isang bagay sa 0 upang makakuha ng 1. Siyempre, sa parehong mga kaso kailangan mong magdagdag ng 1. Kabuuan:

    
    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. Ang pinakamahirap na bahagi ay tapos na! Natanggap namin ang inverse (reverse) code at ang kailangan lang naming gawin ay makuha ang direktang isa. Binabaliktad namin ang lahat ng 0 hanggang 1 at kabaliktaran:

    1100 0001- kabaligtaran na code;

    0011 1110 - ang direktang code ng aming numero, o sa halip ang positibong representasyon nito;

  3. I-convert sa sistema ng decimal na numero ( Online na calculator na may paliwanag ng mga kalkulasyon ):

    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;

    Ang natitira na lang ay magdagdag ng minus sa numero at ang aming sagot:-62.

Sa parehong paraan, ang mga numero ng uri ay na-convert shortsa uri int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10,000,000 sa 10th number system = 0000 0000 1001 1000 1001 0110 1000 0000sa 2nd number system.

    Sa Java, ang isang uri ng numero intay tumatagal ng 4 na byte, at ang isang uri ng shortnumero ay tumatagal ng 2 byte, o 16 na mga bit, kaya pinutol namin ang kaliwa sa 16 na numero:

  2. 1001 0110 1000 0000. Ang pinakakaliwang bit (ang pinaka makabuluhang bit, na kilala rin bilang sign bit) ay naging katumbas ng 1. Nangangahulugan ito na mayroon kaming karagdagang code para sa isang negatibong numero, kaya lumipat kami sa susunod na punto.
  3. Isalin natin ito sa reverse code:

    
    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

    Return code: 1001 0110 0111 1111;

  4. Binabaliktad namin at nakuha ang direktang code: 0110 1001 1000 0000.

  5. Nagko-convert kami sa binary number system at nakakakuha ng positibong representasyon ng aming numero:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Magdagdag ng minus at makuha ang sagot:-27008

Pag-cast ng mga primitive na uri.  Nag-cast ng int sa maikli at byte - 2Mag-link sa isang online na calculator ng forward, reverse at complementary code. Gayundin sa site na ito sa ilalim ng calculator mayroong isang maliit na teorya tungkol sa inverse at complement code.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION