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?
3 Réponses :
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.
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].
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
Quand transtyper en Dans votre exemple, nous terminerons avec seulement les 8 bits inférieurs puisque Java utilise le complément à deux pour représenter Si la valeur était 257, sa représentation binaire serait: convertie en 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
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
.0000 0000 0000 0000 0000 0001 0000 0001
byte
, ce nombre est considéré comme négatif car le bit le plus élevé est défini. 1000 0001
octet
comme: 0000 0000 0000 0000 0000 0000 1000 0001
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
estb = 129;
(sans distribution)