c++ - 0x17 - what is the value of the following integer literal 0x8
¿Es 0 un literal decimal o un literal octal? (3)
Aparentemente, todos los literales enteros que comienzan con cero son de hecho octales. Esto significa que incluye 0 también. Esto hace poca diferencia ya que cero es cero. Pero no saber esto puede lastimarte.
Me di cuenta de esto cuando intentaba escribir un programa para convertir números binarios a resultados decimales y hexadecimales. Cada vez que daba un número que comenzaba con cero obtenía una salida incorrecta (por ejemplo, 012 = 10, no 12).
Es bueno saber esta información para que no cometas el mismo error.
El cero siempre es cero, así que no importa. Pero en una discusión reciente con mi amigo, dijo que los literales octales casi no se usan en la actualidad. Entonces me di cuenta de que en realidad casi todos los literales enteros en mi código son octales, es decir, 0
.
¿Es 0
un literal octal según la gramática de C ++? ¿Qué dice la norma?
Cualquier valor entero con el prefijo 0
es un valor octal. Es decir: 01 es octal 1, 010 es octal 10, que es decimal 8, y 0 es octal 0 (que es decimal, y cualquier otro, 0).
Así que sí, ''0'' es un octal.
Eso es una simple traducción al inglés del fragmento de gramática en la respuesta de @Als :-)
Un entero con el prefijo 0x
no tiene el prefijo 0
. 0x
es un prefijo explícitamente diferente. Aparentemente hay personas que no pueden hacer esta distinción.
Según ese mismo estándar, si continuamos:
integer-literal:
decimal-literal integer-suffixopt
octal-literal integer-suffixopt
hexadecimal-literal integer-suffixopt
decimal-literal:
nonzero-digit <<<---- That''s the case of no prefix.
decimal-literal digit-separatoropt digit
octal-literal:
0 <<<---- ''0'' prefix defined here.
octal-literal digit-separatoropt octal-digit <<<---- No ''x'' or ''X'' is
allowed here.
hexadecimal-literal:
0x hexadecimal-digit <<<---- ''0x'' prefix defined here
0X hexadecimal-digit <<<---- And here.
hexadecimal-literal digit-separatoropt hexadecimal-digit
Sí, 0
es un literal octal en C ++.
Según el estándar de C ++:
2.14.2 Literales enteros [lex.icon]
integer-literal:
decimal-literal integer-suffixopt
octal-literal integer-suffixopt
hexadecimal-literal integer-suffixopt
decimal-literal:
nonzero-digit
decimal-literal digit
octal-literal:
0 <--------------------<Here>
octal-literal octal-digit