¿Cómo funciona la statement printf aquí, cuando se imprime un número entero?

#include int main() { int a=034; printf("%d",a); return 0; } 

Si doy un valor como 034, la salida es 28. Si es 028, da un error que dice “dígito inválido” 8 “en constante octal”.

En C si inicia un entero con un cero ( 0 ), se tratará como una representación octal del número. En representación octal solo hay 8 dígitos válidos. Son 0, 1, 2, 3, 4, 5, 6 y 7.

Así que puedes ver que printf está funcionando correctamente aquí. 034 es un número octal , que es 28 en decimal. Entonces, printf está imprimiendo el valor correcto de la variable int a que es 34 en octal, que es equivalente a 28 en decimal.

Sin embargo, el error, mientras se usa 038 , no está relacionado con el printf . Obtiene un error cuando intenta usar un número como 038 porque está usando una representación octal, al comenzar el número con 0 , pero está usando un dígito no válido, 8 , que simplemente no existe en el sistema de números octal .

PD: si inicia un número con 0x o 0X , se tratará como una representación hexadecimal del número.

PD: si desea imprimir un entero en formato octal, el especificador de formato es %o . Por ejemplo: printf("num = %o \n", num);

PD: si desea imprimir un entero en formato hexadecimal, los especificadores de formato son %x %X Por ejemplo: printf("num1 = %x, num2 = %X \n", num1, num2);

Los enteros se pueden express en forma decimal, octal o hexadecimal.

  • Sin ceros a la izquierda indica un número decimal (base10 => 0-9)
  • Un 0 inicial indica un número octal (base8 => 0-7)
  • Un 0x o 0X inicial indica un número hexadecimal (base16 => 0-9, A / aF / f)

Por ejemplo, 32, 040 y 0x20 son representaciones decimales, octales y hexadecimales del mismo valor.

Así que si

 int a=028; 

te dio :

 error: invalid digit "8" in octal constant 

la razón es obvia, ‘8’ no es un ‘dígito’ octal válido.

printf() hará una operación normal. Las constantes enteras que comienzan con 0 y no constantes hexadecimales son constantes octales como sugiere el mensaje.

034 = 3 * 8 + 4 = 28

Y para cuando el printf lo ve en el momento de la ejecución, el número está en binario, con este aspecto:

 011100 (binary) 

Es decir, dieciséis más ocho más cuatro o 28 (decimal)

Es la función printf, la preocupación aquí es de valor entero, para ser más precisos, valor entero de base 8, es decir, números octales.

Cuando alimentamos una entrada en una variable entera como esta:

 int n = 34; 

Simplemente significa que estamos poniendo un número decimal (de base 10) en la variable n. Pero cuando ponemos un cero adicional delante de dígito, como:

 int n = 034; 

El comstackdor lo interpreta como si quisiéramos poner un valor de base 8, número octal, en la variable n. Por lo tanto, en lugar de colocar el número decimal liso 34, trata la constante de entrada como un octal ((3 * 8) + 4 = 28) y coloca el valor binario correspondiente para él en n.

En notas similares, también podemos alimentar un valor hexadecimal en una variable entera llana, como:

 int n = 0x34; 

Aquí, el comstackdor simplemente pondrá el equivalente binario del valor hexadecimal 0x34 ((3 * 16) + 4 = 52) en variable. Nota. en “0x”, el primer carácter es cero 0, no el carácter ‘o’ o ‘O’

Un ejemplo lo resumirá:

 #include int main(){ int n; //feeding in a Decimal Value n = 34; printf("\n\nDecimal value with\t%%d : %d", n); //feeding in an Octal Value n = 034; printf("\n\nOctal Value with\t%%o : %o", n); printf("\nOctal Value with\t%%d : %d", n); //feeding in a Hexa-decimal Value n = 0x34; printf("\n\nHexadecimal Value with\t%%d : %d", n); printf("\nHexadecimal Value with\t%%x : %x", n); return 0; } /* Output: Decimal value with %d : 34 Octal Value with %o : 34 Octal Value with %d : 28 Hexadecimal Value with %d : 52 Hexadecimal Value with %x : 34 */ 

Espero que esto explique todo ..

Citado de N1570, 6.4.4.1 Constantes enteras : (<- Vea este enlace para obtener más información).

 integer-constant: ...... octal-constant integer-suffixopt ...... ...... octal-constant: 0 octal-constant octal-digit octal-digit: one of 0 1 2 3 4 5 6 7 

Si doy un valor como 034, la salida es 28.

Debido a que el cero 034 , 034 es considerado como una “constante octal” por el comstackdor, y 34 en octal es 28 en decimal.

si es 028, da un error que dice “dígito inválido” 8 “en constante octal”.

Nuevamente, el cero 028 convierte a 028 una “constante octal. Sin embargo, como puede ver arriba, 8 no es un” dígito octal “legal, por lo que el comstackdor le da un error.

El problema aquí es que el lenguaje C identifica los números escritos con 0 como números octales en el tipo de datos Integer. Por lo tanto, si desea imprimir el cero al principio, no use un cero al principio del entero. Prueba este código. Da cero al principio.

 #include int main() { int a=34; char ds[80]; sprintf(ds,"%03d",a); puts(ds); return 0; } 

Tiene que usar sprintf que da salidas con formato. Aquí ds significa puntero a una matriz de caracteres. Aquí el valor de la variable int se almacena en la matriz de caracteres.

 int a = 34; printf("0%i\n", a); 

¡El número no puede tener cero delante! Si necesita imprimir ceros 00345 como este 034 o 00345 o 007 , debe imprimir esos ceros como caracteres.

 printf("00%i", 7); 

Cuando un número comienza con un cero en C / C ++ / JavaScript y en algunos otros idiomas, solo significa un tipo especial de un número que rara vez se utiliza, llamado Octal.