Cuando escribo System.out.println(0123);
obtengo 83
sin embargo, System.out.println((int)0123F);
imprime 123
.Entero con ceros a la izquierda
¿Por qué funciona de esa manera?
Cuando escribo System.out.println(0123);
obtengo 83
sin embargo, System.out.println((int)0123F);
imprime 123
.Entero con ceros a la izquierda
¿Por qué funciona de esa manera?
significa octal 123, es decir 1 * 8 * 8 * 8 + 2 + 3, que es igual a 83. Por alguna razón, los flotadores octales no están disponibles.
Creaciónsignifica el número entero 83. La creación de 0123F significa que la flota 123. Cuando se convierte de nuevo a número entero, sigue siendo 123.
simplemente no lo utiliza el 0 si no decir octal. Después de todo, no son exactamente útiles (y los programadores que sí conocen los números octales se confundirán cuando vean el 09F).
Prueba esto:
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"
primero impresa como 83 porque java tomacomo número octal e imprime equivalente decimal de ese número.
printf
lo hará: http://java.sun.com/developer/technicalArticles/Programming/sprintf/
public class X
{
public static void main(final String[] argv)
{
System.out.printf("%04d", 123);
System.out.println();
}
}
También podría hacer que "%0" + size + "%d"
si desea variar la longitud ... aunque si las longitudes eran comunes probablemente me hago constantes como "%04d"
, "%012d"
, etc ...
El octal (0 a la izquierda) y hexadecimal (0x) fueron heredados de C. Para la comparación, intente
System.out.println(0x123);
En Java, los literales enteros con un cero inicial son enteros octales (base 8).
1 * 8^2 + 2 * 8 + 8 = 83
Así que no utilice ningún número que conduzca con 0, si no desea tratarlo como número octal.
Cualquier número con sufijo 'F' se trata como número flotante.
En dado ejemplo (inf)0123F
se imprime 123
porque 0123F tratado como flotador (123) y se convierte a int valor permanece 123.
-> 83
1010L -> 1010
0101L -> 65
Los números 1010L
y 0101L
no son en representación binaria (sólo para evitar la confusión)
Estos números están en representación decimal.
Incluso según los patrones Regex en Oracle docs,
\ 0n es el carácter con el valor 0n octal (0 < = n < = 7)
\ xhh es el carácter con el valor hexadecimal 0xhh
Por lo tanto, su número 0101
ya sea en Integer
o Long
formato se trata como una representación octal de un número.
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
Y si quiere un número hexadecimal, necesita comenzar con 0x, no con 0. Entonces 0123F es un flotador, 0x123F es hexadecimal. –
@James Socol - Buen complemento. –
¿Pero por qué el 0 principal? Me han dicho que es lo mismo en C, pero eso no explica por qué es 0, y ningún otro carácter aleatorio ASCII. – whirlwin