JavaRush /Blog Java /Random-FR /Casting de types primitifs. Casting en short et en octet
Георгий
Niveau 22
Санкт-Петербург

Casting de types primitifs. Casting en short et en octet

Publié dans le groupe Random-FR
Casting de types primitifs.  Conversion d'int en short et octet - 1Pourquoi est-ce que si vous convertissez certaines valeurs de type inten type shortor byte, les résultats sont inattendus ? Découvrons-le!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Résultat à l'écran :

-62
De manière inattendue, il existe une explication logique à cela : de plus, cette action peut être réalisée de vos propres mains. Pour ce faire, nous devons convertir 450 du décimal en binaire :

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
Dans la colonne de droite du nombre, nous notons son reste lorsqu'il est divisé par 2, et sous le nombre lui-même, nous écrivons le résultat de la division de notre nombre par deux, si le reste est 0. Si le reste est 1, alors en dessous nous écrivons le partie entière issue de la division par deux. ( Calculatrice en ligne avec explication des calculs ). En conséquence, nous obtenons cela dans le système de nombres binaires 450 = 11100 0010. Tout numéro de type intoccupe 4 octets ou 32 bits, chaque bit étant 0 ou 1. Dans notre cas, seuls 9 bits sont occupés, et en principe le nôtre int i = 450en système binaire ressemble à ceci :

0000_0000_0000_0000_0000_0001_1100_0010
Nous voulons écrire notre variable dans une variable de type byte, mais le numéro de type byteprend 1 octet (comme le nom de ce type) ou 8 bits. Par conséquent, les bits supplémentaires à gauche sont simplement supprimés, et au final nous obtenons :

1100 0010
Plage de valeurs de type byte: -128 à 127. Chaque nombre occupe 8 bits et le bit le plus à gauche de chaque nombre est le bit de signe. Pour tous les nombres positifs il est égal à 0, pour tous les nombres négatifs il est égal à 1. Il n'est pas nécessaire de se précipiter pour convertir notre résultat obtenu ci-dessus dans le 10ème système, car nous avons reçu un code supplémentaire pour le numéro souhaité, et non direct. Le bit le plus à gauche s'est avéré égal à 1, donc notre nombre est négatif, et pour les nombres négatifs, les codes directs et inverses ne coïncident pas, contrairement aux positifs. Si le bit de signe était égal à 0, alors nous pourrions immédiatement convertir le nombre en système de nombres décimaux et obtenir : 66. Mais le bit de signe est négatif, nous devons donc d'abord convertir le code supplémentaire en code direct et ajouter un moins signez à la réponse. Pour plus de clarté et de formation, essayons d'abord d'obtenir le code supplémentaire d'un numéro, par exemple -15. Pour ce faire, dans le code direct de sa représentation positive (numéro 15), vous devez changer tous les 0 en 1 et vice versa (obtenir le code inverse, également appelé inverse), puis en ajouter un au résultat. Dans le système décimal 15 = 0000 1111; Code inversé (changer tous les 0 en 1 et vice versa) =1111 0000 ; Code supplémentaire (ajoutez-en un) :

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Code supplémentaire pour le numéro -15 : 1111 0001; Super. Maintenant, par analogie avec l'exemple ci-dessus, nous devons convertir notre code supplémentaire en code direct ; je vous rappelle qu'il est égal à 1100 0010.
  1. Soustrayez-en un et obtenez le code inverse. C'est pratique pour ce faire, notez un code supplémentaire dans la réponse et voyez à quoi vous devez en ajouter un pour obtenir un tel code supplémentaire. Nous commençons par le chiffre le plus à droite et regardons : à quoi devons-nous ajouter 1 pour obtenir 0 ? À 1, nous obtenons 10, 0 va en réponse et 1 va au chiffre suivant. Ensuite, ce qu'il faut ajouter à 0 pour en obtenir un. Un, mais puisque nous avons un un du chiffre précédent, nous écrivons en réponse 0. Ensuite, pour obtenir 0, que devons-nous ajouter à 0 ? Bien sûr, 0. Donc encore 4 fois. Et il reste les 2 derniers chiffres, où vous devez ajouter quelque chose à 0 pour obtenir 1. Bien sûr, dans les deux cas, vous devez ajouter 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. Le plus dur est passé ! Nous avons reçu le code inverse (inverse) et il ne nous reste plus qu'à obtenir le code direct. Nous inversons tous les 0 en 1 et vice versa :

    1100 0001- code inversé ;

    0011 1110 - le code direct de notre numéro, ou plutôt sa représentation positive ;

  3. Convertir au système de nombres décimaux ( Calculatrice en ligne avec explication des calculs ) :

    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;

    Il ne reste plus qu'à ajouter un moins au nombre et notre réponse :-62.

De la même manière, les nombres de type sont convertis shorten type int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10 000 000 dans le 10ème système numérique = 0000 0000 1001 1000 1001 0110 1000 0000dans le 2ème système numérique.

    En Java, un numéro de type intprend 4 octets, et un shortnuméro de type prend 2 octets, soit 16 bits, nous avons donc coupé la gauche à 16 chiffres :

  2. 1001 0110 1000 0000. Le bit le plus à gauche (le bit le plus significatif, également appelé bit de signe) s'est avéré être égal à 1. Cela signifie que nous avons un code supplémentaire pour un nombre négatif, nous passons donc au point suivant.
  3. Traduisons-le en code inversé :

    
    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

    Code de retour: 1001 0110 0111 1111;

  4. On inverse et on obtient le code direct : 0110 1001 1000 0000.

  5. Nous convertissons au système de nombres binaires et obtenons une représentation positive de notre nombre :

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Ajoutez un moins et obtenez la réponse :-27008

Casting de types primitifs.  Casting en short et octet - 2Lien vers un calculateur en ligne de codes directs, inverses et complémentaires. Également sur ce site, sous la calculatrice, il y a une petite théorie sur le code inverse et complémentaire.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION