Java hat eigentlich keine vorzeichenlosen Primitive.
Der Wert 127 wird tatsächlich durch '01111111' dargestellt, wobei das erste Bit das Vorzeichen ist (0 ist positiv).
Ein vorzeichenloses Byte könnte die Werte 0 bis 255 enthalten, aber 127 ist das Maximum für ein vorzeichenbehaftetes Byte. Da ein Byte 8 Bits hat, und das vorzeichenbehaftete Byte verbraucht eins, um das Zeichen zu halten. Wenn Sie also Werte größer als 127 darstellen möchten, müssen Sie einen größeren Typ verwenden, der eine größere Anzahl von Bits enthält. Der größere Typ hat auch ein reserviertes Bit für das Vorzeichen, aber es hat mindestens 8 Bits für die tatsächlichen Werte, so dass Sie den Wert 255 darstellen können.
Davon abgesehen, sollten Sie wahrscheinlich vermeiden, Byte und Short da zu verwenden sind Probleme mit ihnen. Sie werden feststellen, dass das Ergebnis zu kurz ist, da die Operatoren tatsächlich int zurückgeben. Sie sollten nur bei int und long in Java bleiben, da sie besser implementiert sind.
Edit: der UND-Operator macht es vorzeichenlos, da das Vorzeichenbit das erste Bit des Kurzschlusses ist und Sie die 8 Bits kopieren, die den Wert des Bytes auf die letzten 8 Bits des Kurzschlusses halten. Wenn Sie also eine negative Zahl haben, wird das erste Bit, das 1 ist (das heißt, es ist negativ), tatsächlich Teil des Werts. Und der Short wird immer positiv sein, da sein Vorzeichen-Bit bei zwei High einer Zweierpotenz liegt, um vom Short betroffen zu sein.
byte: 10101101
||||||| <- actual value
short: 0000000010101101
||||||||||||||| <- actual value
Edit 2: Beachten Sie aber, dass, da die negativen Werte two's complement representation verwenden der Wert vielleicht nicht, was Sie es erwarten. Alle positiven Werte bleiben gleich.
Aber -128 = 0x10000000 wird 128 werden
-127 = 0x10000001 129
werden wird und so weiter, bis -1 = 0x11111111 die 255
Jeder Link für die Probleme über Byte und kurz? Ich habe Byte jedes Mal in einer Weile verwendet, aber nie wirklich kurz verwendet. –
@DeanJ: Ich denke, das Problem ist die Leistung, da Sie mehr Umwandlungen benötigen, weil viele Operationen int zurückgeben. – Cloudanger
Das erste Beispiel hier zeigt den Punkt: http: //blog.mpathirage.com/2010/06/27/java-puzzlers-phantom-referenz-bedrohung-angriff-der-klon-rache-der-schicht/Wenn Sie einen Operator auf der Short wie + oder - verwenden, verwandelt es sich tatsächlich in ein int und das kann Probleme beim Aufruf überladener Methoden verursachen. –