Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

189
Views
¿Cómo puedo imprimir números binarios dentro de matrices?

Estoy tratando de imprimir números binarios en lenguaje C. Tengo un problema con los números binarios que comienzan con 0. Cuando intentas mantenerlo en las matrices e intentas imprimirlo, aparecen números aleatorios, cuando ingresas con scanf, el cero inicial del número desaparece.

¿Que debería hacer en esta situación? Gracias de antemano por su ayuda.

 int main(){ int binarys[3] ={01001001, 01100110, 00100000}; size_t i; for(i=0; i<3; i++) { printf("%d\n", binarys[i]); } int binary; printf("Enter a binary: "); scanf("%d", &binary); printf("%d", binary); }

Producción:

 262657 294984 32768 Enter a binary: 01001001 1001001
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Literales enteros:

En C y C++, un literal entero que comienza con 0 significa que se representa en octal (base 8).

Por lo tanto, la matriz de int s que ha inicializado contiene los valores octales de 1001001, 1100110, 100000, que son 262657, 294984, 32768 respectivamente.

Los literales binarios están disponibles en C++ desde C++ 14. Se supone que C lo admite en C23 (consulte: https://en.cppreference.com/w/c/language/integer_constant ).

En este ejemplo de código:

 int main() { int a = 010; printf("%d\n", a); int b = 0b10; printf("%d\n", b); }

Se imprimirá lo siguiente (C++ 14):

 8 2

Porque 8 es el valor decimal del 10 octal y 2 es el valor decimal del 10 binario.

El problema con scanf :

scanf analiza el valor ingresado como un int decimal (ya que especificó el especificador de formato %d ). No aplica las reglas literales del lenguaje. Por lo tanto, se ignora el 0 inicial que no tiene significado matemático. Ingresó 01001001 , que se analiza como el int decimal con valor 1001001 y eso es lo que ve en el printf que sigue (que nuevamente usa el especificador de formato %d ).

over 4 years ago · Santiago Trujillo Report

0

Tengo un problema con los números binarios que comienzan con 0

Las constantes enteras que comienzan con 0 no son binarias sino octales.

Si tienes un compilador que ofrece el prefijo 0b como extensión (o vienes del futuro donde esto ha sido estandarizado) y quieres declarar un entero con el valor 32, en base dos por el motivo que sea, escribe 0b00100000 . Sin embargo, seguirá teniendo exactamente el mismo contenido que si acabara de escribir 32 , porque una base es la forma en que se representa un número y no afecta su valor.

cuando obtienes entrada con scanf,

La función scanf no tiene un especificador de conversión para binario, y %d significa explícitamente decimal , es decir, base 10.

Si desea escanear números escritos en binario, deberá leer una cadena, confirmar que solo son unos y ceros y convertirla usted mismo (es decir, usar strtol como strol(str, &end, 2) ).

... el cero inicial del número desaparece

Los ceros iniciales no se imprimen de forma predeterminada.

Nuevamente, printf no tiene un especificador de conversión binaria de todos modos, pero si desea imprimir ceros a la izquierda, debe establecer un ancho de campo y solicitar un relleno de cero, como %08d .

Si desea imprimir números en binario, primero debe convertirlos en una cadena.

over 4 years ago · Santiago Trujillo Report

0

C no admite (todavía) constantes enteras binarias o especificadores de conversión scanf/print para binario. Se ha propuesto para el próximo estándar C "C23". Hasta entonces, el prefijo 0b y los especificadores de conversión %b pueden ser admitidos por algunos compiladores como extensiones no estándar ( 0b muy probable, %b no tan probable).

Los números que comienzan con 0 son en realidad constantes enteras octales. De cualquier manera, imprimir/leer alguna constante entera 01001001 usando %d no tiene sentido.

Con el estándar C actual, podría preparar una conversión en tiempo de compilación usando un montón de macros ciertamente feas:

 #include <stdio.h> #define STATIC_ASSERT(expr) (int [expr]){0} #define STR_TO_BIN(str) ( (str[0]-'0') * 128 + \ (str[1]-'0') * 64 + \ (str[2]-'0') * 32 + \ (str[3]-'0') * 16 + \ (str[4]-'0') * 8 + \ (str[5]-'0') * 4 + \ (str[6]-'0') * 2 + \ (str[7]-'0') * 1 ) #define BINARIFY(n) (STATIC_ASSERT(sizeof(#n)==9), STR_TO_BIN(#n)) int main(){ int binaries[3] ={BINARIFY(01001001), BINARIFY(01100110), BINARIFY(00100000)}; for(size_t i=0; i<3; i++) { printf("%d\n", binaries[i]); } }

(La "afirmación estática del hombre pobre" protege contra el acceso fuera de los límites de la matriz, pero no contra los formatos de entrada incorrectos).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!