Littéraux binaires Java-Valeur -128 pour l'octet


Depuis SE 7 Java permet de spécifier des valeurs en tant que littéral binaire. La documentation me dit que 'byte' est un type qui peut contenir 8 bits d'informations, les valeurs -128 à 127.

Maintenant, je ne sais pas pourquoi mais je ne peux pas définir 8 bits mais seulement 7 si j'essaie d'attribuer un littéral binaire à un octet en Java comme suit:

byte b = 0b000_0000;    //solves to the value 0
byte b1 = 0b000_0001;   //solves to the value 1
byte b3 = 0b000_0010;   //solves to the value 2
byte b4 = 0b000_0011;   //solves to the value 3     

Et ainsi de suite jusqu'à ce que nous arrivions aux dernières possibilités en utilisant ces 7 bits:

byte b5 = 0b011_1111;   //solves to the value 63
byte b6 = 0b111_1111;   //solves to the value 127

Si je veux en faire des nombres négatifs, je dois ajouter un leading-in front comme ceci:

byte b7 = -0b111_1111;   //solves to the value -127

Maintenant la moitié du problème que j'ai est que j'utilise seulement 7 bits pour décrire ce qu'ils disent de moi, c'est un 8 bits type de données. La seconde moitié est qu'ils ne semblent pas être filetés comme complément de deux à moins d'utiliser un type int 32 bits où je peux définir tous les 32 bits ("bit d'indicateur de signe" inclus).

Maintenant, quand je recherche sur la façon d'afficher le nombre dans la plage -128, on m'a dit de le faire de cette façon sans plus d'explication:

byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000;

Je peux clairement voir que le dernier bit 8 (1000 0000) représentent -128 dans deux contraintes en utilisant 8 Bits, mais je n'ai jamais été plus confus et j'essaie de poser mes questions:

  • Le nr long de 32 bits ci-dessus n'est-il pas une valeur int de 32 bits (java -)?
  • Pourquoi puis-je attribuer une valeur de 32 bits à un type d'octet 8 bits (java -)?

Ou en général: Pourquoi dois-je l'assigner de cette façon?

Tous les liens / informations à ce sujet serait génial! Merci pour le temps que vous avez pris pour lire ceci ainsi que toute autre information préalablement.

Cordialement Jan

Author: JBA, 2013-05-27

1 answers

Selon la spécification Java,

Http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1

tous les vos déclarations (b, b1,..., et b8) utilisent int littéraux, même lorsqu'ils tiennent dans un octet. Il n'y a pas de littéral d'octet en Java, vous ne pouvez utiliser qu'un int pour initialiser un octet.

J'ai fait quelques tests et byte neg128 = -0b1000_0000; fonctionne très bien. 0b1000_0000 est 128, il vous suffit donc de mettre un signe - avant. Remarquez que cela 1 n'est pas un sign bit du tout (ne pensez pas aux octets de 8 bits, pensez aux ints de 32 bits convertis en octets). Donc, si vous souhaitez spécifier le bit de signe, vous devez écrire tous les 32 bits, comme vous l'avez démontré.

, Donc byte b8 = 0b1000_0000; est une erreur tout comme byte b8 = 128; est une erreur (+128 ne rentre pas dans un octet). Vous pouvez également forcer la conversion avec un cast:

byte b = (byte) 0b1000_0000; ou byte b = (byte) 128;

La distribution indique au compilateur que vous savez que 128 ne tient pas dans un octet et que le modèle de bits sera réinterprété comme -128.

 8
Author: marcus, 2013-09-23 13:20:19