1
votes

Que se passe-t-il lorsque j'attribue une valeur supérieure à l'octet?

Que se passe-t-il lorsque j'attribue une valeur supérieure à byte?

Selon la documentation officielle d'Oracle, Byte est

  • Octet: le type de données octet est un entier de complément à deux signé de 8 bits. Il a une valeur minimale de -128 et une valeur maximale de 127 (inclus). Le type de données byte peut être utile pour économiser de la mémoire dans de grands tableaux, là où les économies de mémoire comptent réellement. Ils peuvent également être utilisés dans lieu de int où leurs limites aident à clarifier votre code; le fait que la plage d'une variable est limitée peut servir de documentation

Mon code est

byte b = (byte) 128;

Résultat:

b=-127

Que se passe-t-il lorsque j'attribue une valeur supérieure à octet. Le compilateur Java signalera une erreur. J'irai si je transforme cette valeur en octet

public class B
{

    public static void main(String args[])
    {
        byte b;
        b=(byte)129;
        System.out.println("b="+b);

    }
}   

Je ne comprends pas le résultat de ce programme?


7 commentaires

le débordement se produit


@CarlosHeuberger pourquoi la sortie du programme est 127 avec un signe moins. ne devrait-il pas être 127 seulement?


mon commentaire précédent concernait la question avant que vous ne la modifiiez ( "Types d'erreur incompatibles: conversion avec perte possible de int en octet." )! Documentation: 5.1.3. Réduction de la conversion primitive


@CarlosHeuberger pourquoi y a-t-il un signe moins dans la sortie. Merci pour le lien de documentation


Dr Lanning: C'est, inspecteur, la «bonne question». - Je robot! car le bit le plus élevé de l'octet est défini: 129 = 1000 0001 en binaire - lisez la documentation: " cela peut faire que le signe de la valeur résultante diffère du signe de la valeur d'entrée < / i> "


@Aman Comment Java gère-t-il les sous-débordements et les débordements d'entiers et comment le vérifieriez-vous? stackoverflow.com/questions/3001836/... Ce message concerne int mais le concept est le même pour l'octet.


Remarque: n'obtient l'erreur du compilateur que lorsque la conversion en octet est b = 129; (sans distribution)


3 Réponses :


-1
votes

Le type de données octet Beacause est de 1 octet selon le nom. donc, sa plage est de -127 à +126 (c'est-à-dire que la capacité est de 256). Par conséquent, +129 ne peut pas être stocké dans un type de données octet. donc +129 est tronqué à -127.


4 commentaires

non arrondi, tronqué - " Une conversion restrictive d'un entier signé en un type entier T rejette simplement tous sauf les n bits de poids faible, "


@Sachin Maharjan Merci pour la réponse! Pouvez-vous nous expliquer comment l'arrondissement est effectué en Java?


@CarlosHeuberger désolé, mon mal.


La plage d'octets est [-128..127].



5
votes

Pour le type d'octet, vous n'avez que 8 bits pour stocker la valeur. Vous ne pouvez avoir que 256 valeurs distinctes (2 ^ 8 = 256). Java représente des valeurs négatives avec '1' comme bit le plus élevé:

+129 (dec) => 00000000 00000000 00000000 10000001  (int representation)

but 10000001 (bit) is -127 (dec) in byte representation of java type (as described above)

Lorsque vous essayez de définir une valeur qui nécessite plus d'un octet à stocker, la définition de l'octet le plus bas sur une valeur d'octet se produit:

-128 (dec) => 10000000 (bit)
-127 (dec) => 10000001 (bit)
... 
-1   (dec) => 11111111 (bit)
0    (dec) => 00000000 (bit)
+1   (dec) => 00000001 (bit)
+127 (dec) => 01111111 (bin)

Pour mieux comprendre le problème de débordement en Java, consultez l'article: https://medium.com/@jeanvillete/java-numeric-overflow-underflow-d6b206f96d88


0 commentaires

4
votes

129 est un entier littéral et, puisqu'il n'est pas suivi de L ou l , il est de type int code >. Cela a 32 bits (4 octets):

0000 0001

Quand transtyper en octet 5.1.3. La conversion primitive restreinte est effectuée, ce qui supprime tous les bits, sauf les 8 bits inférieurs, de sorte que les valeurs tiennent dans byte.

Dans votre exemple, nous terminerons avec seulement les 8 bits inférieurs

0000 0000  0000 0000  0000 0001  0000 0001

puisque Java utilise le complément à deux pour représenter byte , ce nombre est considéré comme négatif car le bit le plus élevé est défini.

Si la valeur était 257, sa représentation binaire serait:

1000 0001

convertie en octet comme:

0000 0000  0000 0000  0000 0000  1000 0001


0 commentaires