Warum werden Integer-Literale mit führenden Nullen seltsam interpretiert?

Lesezeit: 1 Minute

Warum werden Integer Literale mit fuhrenden Nullen seltsam interpretiert
IAdapter

Dies druckt 83

System.out.println(0123)

Dies druckt jedoch 123

System.out.println(123)

Warum funktioniert das so?

1646639826 951 Warum werden Integer Literale mit fuhrenden Nullen seltsam interpretiert
luiskubal

Eine führende Null gibt an, dass das Literal mit ausgedrückt wird Oktal (eine Zahl zur Basis 8).

0123 kann dadurch umgewandelt werden (1 * 8 * 8) + (2 * 8) + (3), was dezimal 83 entspricht. Aus irgendeinem Grund sind Oktal-Floats nicht verfügbar.

Verwenden Sie einfach nicht die führende Null, wenn das Literal nicht in Oktal ausgedrückt werden soll.

Da ist auch ein 0x Präfix, das angibt, dass das Literal hexadezimal (Basis 16) ausgedrückt wird.

Warum werden Integer Literale mit fuhrenden Nullen seltsam interpretiert
Werkzeugkasten

Da Integer-Literale beginnend mit 0 werden als Oktalzahlen behandelt.

Siehe Abschnitt 3.10.1 des JLS

Versuche dies:

public static String leftPad(int n, int padding) {
    return String.format("%0" + padding + "d", n);
}
leftPad(5, 3); // return "005"
leftPad(15, 5); // return "00015"
leftPad(224, 3); // return "224"
leftPad(0, 4); // return "0000"

Die erste wird als 83 gedruckt, weil Java 0123 als Oktalzahl nimmt und das Dezimaläquivalent dieser Zahl druckt.

Oktal (führende 0) und Hexadezimalzahl (führende 0x) wurden von C geerbt. Versuchen Sie es zum Vergleich

System.out.println(0x123);

1646639827 83 Warum werden Integer Literale mit fuhrenden Nullen seltsam interpretiert
Michael

In Java sind Integer-Literale mit führender Null oktale Integer (Basis 8).

(1 * 8^2) + (2 * 8^1) + (3 * 8^0) = 83

Verwenden Sie also keine Zahl, die mit 0 vorangeht, wenn Sie sie nicht als Oktalzahl behandeln möchten.

Warum werden Integer Literale mit fuhrenden Nullen seltsam interpretiert
Devendra Lattu

0123 -> 83
1010L -> 1010  
0101L -> 65

Die Zahlen 1010L und 0101L sind nicht in binärer Darstellung (nur um Verwirrung zu vermeiden).
Diese Zahlen sind in Dezimaldarstellung.

Sogar gemäß den Regex-Mustern in Oracle-Dokumente,

\0n ist das Zeichen mit dem Oktalwert 0n (0 <= n <= 7)
\xhh ist das Zeichen mit dem Hexadezimalwert 0xhh

Also deine Nummer 0101 sei es drin Integer oder Long Format wird als Oktaldarstellung einer Zahl behandelt.

123 => 1 * 8^2 + 2 * 8^1 + 1 * 8^0 = 83
0101 => 1 * 8^2 + 0 * 8^1 + 1 * 8^0 = 64 + 0 + 1 = 65

964160cookie-checkWarum werden Integer-Literale mit führenden Nullen seltsam interpretiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy