¿Por qué los literales enteros con ceros a la izquierda se interpretan de manera extraña?

1 minuto de lectura

¿Por que los literales enteros con ceros a la izquierda
Adaptador

Esto imprime 83

System.out.println(0123)

Sin embargo, esto imprime 123

System.out.println(123)

¿Por qué funciona de esa manera?

1646967006 901 ¿Por que los literales enteros con ceros a la izquierda
luiscubal

Un cero inicial indica que el literal se expresa usando octal (un número de base 8).

0123 se puede convertir haciendo (1 * 8 * 8) + (2 * 8) + (3), que es igual a 83 en decimal. Por alguna razón, los flotantes octales no están disponibles.

Simplemente no use el cero inicial si no tiene la intención de que el literal se exprese en octal.

También hay una 0x prefijo que denota que el literal se expresa en hexadecimal (base 16).

¿Por que los literales enteros con ceros a la izquierda
caja de herramientas

Porque los literales enteros que comienzan con 0 se tratan como números octales.

Ver apartado 3.10.1 del JLS

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"

el primero impreso como 83 porque Java toma 0123 como número octal e imprime el equivalente decimal de ese número.

El octal (0 inicial) y el hexadecimal (0x inicial) se heredaron de C. A modo de comparación, intente

System.out.println(0x123);

1646967007 593 ¿Por que los literales enteros con ceros a la izquierda
Miguel

En Java, los literales enteros con un cero inicial son enteros octales (base 8).

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

Por lo tanto, no use ningún número que comience con 0 si no desea tratarlo como un número octal.

¿Por que los literales enteros con ceros a la izquierda
Devendra Lattu

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

Los números 1010L y 0101L no están en representación binaria (solo para evitar la confusión).
Estos números están en representación decimal.

Incluso según los patrones Regex en Documentos de Oracle,

\0n es el carácter con valor octal 0n (0 <= n <= 7)
\xhh es el carácter con valor hexadecimal 0xhh

Por lo tanto, su número 0101 ya sea en Integer o Long El 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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad