type d'octet signé et opérateurs au niveau du bit en Java?


Citation de oracle website "octet: Le type de données octet est un entier de complément de deux signé de 8 bits. Il a une valeur minimale de -128 et une valeur maximale de 127 (inclus)".

Ici, les deux premières lignes sont valides mais la dernière ne l'est pas

            byte b = -128;
        byte b1 = 127;
        byte b2 = b>>>b1;//illegal

Q1) qu'entend-on exactement par 8 bits signés? 128 au format binaire serait 1000 0000 et -128 aurait besoin d'un bit supplémentaire pour le signe négatif, où il conviendrait si tous les 8 bits sont occupés.

Q2) pour int, il y a un opérateur de décalage à droite non signé, mais cela semble illégal avec les octets, pourquoi en est-il ainsi. le débordement ne peut-il pas être empêché en cas d'octets. Dans cas de int, cela fonctionne

Merci pour votre aide

Author: Community, 2013-10-17

1 answers

  1. Juste ce que cela ressemble: Il y a 8 bits, contenant 2^8 = 256 valeurs possibles. Il est signé, donc la plage est frmo -128 à 127 (256 valeurs). Le bit le plus significatif a une valeur de -128.

  2. En Java, promotion numérique binaire se produit avec des opérations telles que b >>> b1. Les deux types sont promus en int, et le résultat est un int. Cependant, vous pouvez explicitement renvoyer le résultat à byte.

Voici le casting:

byte b2 = (byte) (b >>> b1);

Le JLS, section 5.6.2, parle de la promotion numérique binaire:

L'élargissement de la conversion primitive (§5.1.2) est appliqué pour convertir soit les deux opérandes comme spécifié par les règles suivantes:

Si l'un des opérandes est de type double, l'autre est converti en double.

Sinon, si l'un des opérandes est de type float, l'autre est converti flotter.

Sinon, si l'un des opérandes est de type long, l'autre est converti long.

Sinon, les deux opérandes sont convertis en type int.

(emphase à moi)

 5
Author: rgettman, 2013-10-17 18:27:41