2010-08-02 7 views
5

Ich möchte verstehen, wie vorzeichenbehaftete Zahl in unsigned zu konvertieren.Verstehen von Java-Zahlen ohne Vorzeichen

können sagen, ich habe dies:

byte number = 127; // '1111111' 

haben, um es ohne Vorzeichen zu machen I „größer“ Datentyp ‚kurz‘ und gelten AND-Operator mit dem Wert 0x00ff zu wählen.

short number2; 
number2 = number & 0x00ff; 

Warum macht die Nummer unsigned?

Antwort

4

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

+0

Jeder Link für die Probleme über Byte und kurz? Ich habe Byte jedes Mal in einer Weile verwendet, aber nie wirklich kurz verwendet. –

+0

@DeanJ: Ich denke, das Problem ist die Leistung, da Sie mehr Umwandlungen benötigen, weil viele Operationen int zurückgeben. – Cloudanger

+0

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. –

1

Java verfügt nicht über vorzeichenlose Datentypen. Sie wechseln nur zum "größeren" Datentyp, das ist alles.

+0

werden werde ich gefragt, wie diese UND-Operation es unsigned – shlomjmi

+0

macht es nicht mach es zu einem unsignierten Typ. Das Maximum, das Sie mit Bit-Shift-Magie erreichen können, ist, Minus wegzuwerfen. Aber das macht es nicht vorzeichenlosen Typ. Wie auch immer, wie denkst du, dass das passiert? Bitshifting erstellt versehentlich neue Unterklassen oder Hacks in JVM? – foret

0

Wenn Sie nur von einem negativen Byte zu int wechseln, wird der int auch negativ sein. Du nimmst das negative int (oder kurz in deinem Beispiel) und setzt das höchste 3 Byte (int) auf 0x00.

Verwandte Themen