11 votes

Ajouter des octets avec le casting de type, Java

J'essaie d'ajouter deux valeurs dans un tableau d'octets. Voici mon code :

byte[] ars = {3,6,9,2,4};
ars[0] = (byte)ars[0] + (byte)ars[4];
System.out.println( ars[0] );

J'obtiens cette erreur lors de la compilation :

Main.java:9: possible loss of precision
found   : int
required: byte
    ars[0] = (byte)ars[0] + (byte)ars[4];
                          ^
1 error

Toute aide est, comme toujours, très appréciée.

13voto

edthethird Points 3180

Proche, mais un peu décalé.

ars[0] = (byte)(ars[0] + ars[4]);

garder à l'esprit ars[0] y ars[4] sont déjà des octets, il n'est donc pas nécessaire de les convertir en octets.

Au lieu de cela, il faut convertir le résultat de la somme en un octet.

13voto

Taymon Points 8103

En Java, la somme de deux byte est un int . En effet, par exemple, deux nombres inférieurs à 127 peuvent s'additionner à un nombre supérieur à 127. int pour presque tous les nombres.

Pour satisfaire le compilateur, remplacez la ligne en question par ceci :

ars[0] = (byte)(ars[0] + ars[4]);

5voto

J'ai rencontré cette question il y a quelque temps et j'ai rassemblé tous les résultats ici : http://downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/

Nous savons tous que les octets sont convertis en ints lors d'une opération arithmétique. Mais pourquoi cela se produit-il ? La JVM n'a pas d'instructions arithmétiques définies pour les octets. Les variables de type octet doivent être ajoutées en les "promouvant numériquement" vers le type "int", puis en les ajoutant. Pourquoi n'y a-t-il pas d'instructions arithmétiques pour le type byte dans la JVM ? La spécification de la JVM le dit clairement :

La machine virtuelle Java fournit le support le plus direct pour les données de type int. Cela s'explique en partie par l'anticipation d'implémentations efficaces des piles d'opérandes et des tableaux de variables locales de la machine virtuelle Java. Elle est également motivée par la fréquence des données de type int dans les programmes typiques. Les autres types intégraux bénéficient d'un support moins direct. Il n'existe pas de versions byte, char ou short des instructions store, load ou add, par exemple.

4voto

flyinrhyno Points 159
public static void main(String args[]){
    byte[] ars = {3,6,9,2,4};
    ars[0] = (byte)(ars[0] + ars[4]);
    System.out.println( ars[0] );
}

Ceci est dû au fait que Java convertit automatiquement les expressions qui utilisent des variables de type byte et short en int... ceci afin d'éviter le risque potentiel d'un overflow.... même si le résultat est de l'ordre de byte Java promeut le type d'expression en int...

2voto

Chetter Hummin Points 2898

Veuillez remplacer cette ligne par la suivante

ars[0] = (byte)(ars[0]+ars[4]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X