2016-06-02 4 views
1

das folgende Beispiel zeigt:Java int Datentyp automatische Konvertierung bei der Verwendung von binären Wert

int a = 0111; 

System.out.println(a); 

Output: 73 

Warum ist das passiert und wie kann ich den genauen Wert ohne Konvertierung bekommen?

+0

Verwenden Sie "0b111", um den Binärwert zu erhalten. – SomeJavaGuy

+0

Ich habe versucht, es als 7 ausgibt. –

+0

Oh Sorry über die Duplizierung, da diese Frage nicht einfach war, andere zu verstehen, aber können Sie bitte erklären, wie ich den genauen Wert erhalten kann. –

Antwort

3

Nach der Java Language Specification 3.10.1. Integer Literals gibt es 4 Möglichkeiten, eine Ganzzahlliteral zu schreiben:

  • DecimalNumeral: Digit 1-9 von null oder mehr Ziffern 0-9 oder die Anzahl 0 gefolgt.
  • HexNumeral: Führend 0x gefolgt von einer oder mehreren hexadezimalen Ziffern (0-9, a-f). Nicht Groß-und Kleinschreibung.
  • OctalNumeral: Ziffer 0 gefolgt von einer oder mehreren Ziffern 0-7.
  • BinaryNumeral: Führende 0b gefolgt von einer oder mehreren Ziffern 0 oder 1. Nicht Groß-und Kleinschreibung.

(Alle 4 erlauben Unterstrichen für Klarheit)

Wie Sie sehen können, die Zahl 111 auf dem Präfix abhängt:
0111 (OctalNumeral) ist 1*8*8 + 1*8 + 1 = 64+8+1 = 73.
111 (DecimalNumeral) ist 1*10*10 + 1*10 + 1 = 100+10+1 = 111.
0b111 (BinaryNumeral) ist 1*2*2 + 1*2 + 1 = 4+2+1 = 7.
0x111 (HexNumeral) ist 1*16*16 + 1*16 + 1 = 256+16+1 = 273.

Welche davon richtig ist, hängt davon ab, was Sie wollten.

+1

Wie kann ich die Konvertierung stoppen und die genaue Ausgabe als 0111 erhalten? –

+0

Die Ausgabe einer führenden Null bei * Ausgabe * ist ein Formatierungsproblem. Nummer hat keine führenden Nullen. Um die führende Null bei der Ausgabe zu erhalten, verwenden Sie 'printf ("% 04d ", 111)' oder das zugrunde liegende 's = String.format ("% 04d ", 111)'. – Andreas

2

Nun, Sie bekommen den genauen Wert. Das Problem ist das Format.

0111 

wird als Oktalwert in Java interpretiert. Also ist Ihr Wert eigentlich 73, wie eine schnelle Berechnung zeigen würde.

Ein Oktalwert in Java wird auf diese Weise definiert:

OctalNumeral: 
    0 OctalDigits 
    0 Underscores OctalDigits 

jls 3.10.1

So würde 0_111 auf die gleiche Art und Weise interpretiert werden.

Das Format, in Java-Code zu verwenden, wäre:

0b111 

, die als 7 wird tatsächlich interpretiert - in binary format - wie erwartet.

Ich werde die Links später hinzufügen, ich bin in Eile.

Verwandte Themen