what the literal following 0x8 0x17 c++ zero octal

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