Ir ao conteúdo
  • Cadastre-se
Carla Maria

C Conversão decimal/binario e soma dos numeros binarios convertidos

Recommended Posts

Olá pessoal tudo bem?

 

Pois bem eu estou com um problema nessa atividade: receber dois números decimais(considerar números negativos), convertê-los para binário e fazer a soma binária dos números convertidos.

O meu código está dando erro na parte dos números negativos.

Quem puder me ajudar eu agradeço!

#include <stdio.h>
#define bits 15

int main (){
 int valor1,                  /*armazena o primeiro número decimal informado pelo usuário */
     valor2,                  /*armazena o segundo número decimal informado pelo usuário*/
  vetvalor1[bits],            /*armazena o primeiro número convertido para binário*/
  vetvalor2[bits],          /*armazena o segundo número convertido para binário*/
  np[15],
  i,k,t,                        /*contadores*/
  vaium=0,                    /*armazena o vai um da soma dos binários*/
  soma[bits];                       /*armazena a soma dos binários*/

 printf("         Conversão de Valores - Decimal x Binário         ");
 printf("\n ***************************************************** \n");
 np[15]=1;
 printf("\n Informe o primeiro número:");
 scanf("%d", &valor1);

   /* Transformando o primeiro número em binário */
 if (valor1>0){ /*Verificando se o número é positivo ou negativo*/

  for (i=bits; i >= 0; i--){

    if (valor1 % 2 == 0)
       vetvalor1[i] = 0;
      else
       vetvalor1[i]=1;
valor1=valor1 / 2;


   }  /* for */
 } /*if (valor1>0)*/

   else{                 /*Se o número for negativo*/
    for (i=bits; i >= 0; i--){

      if (valor1%2==0)
       vetvalor1[i]=1;
      else
       vetvalor1[i]=0;
    valor1=valor1 / 2;
    vetvalor1[i]=vetvalor1[i]+np[15]+vaium;
        if(vetvalor1[i]==3 || vetvalor1[i]==1)t=1;else t=0;

           if((vetvalor1[i]==2)){
            vetvalor1[i]=0;
            vaium=1;
        }
        else
            if(vetvalor1[i]==3){
                vetvalor1[i]=1;
                vaium=1;
            }
            else
                vaium=0;
            }

       }

 printf("\n O primeiro número convertido para binário é:   ");

 for (i=0; i <= bits; i++)
  printf("%d",vetvalor1[i]);

 printf("                                                    ");
 printf("\n Informe o segundo número:");
 scanf("%d", &valor2);

 /* Transformando o segundo número em binário */
 if (valor2>0){ /*Verificando se o número é positivo ou negativo*/

  for (i=bits; i >= 0; i--){

    if (valor2 % 2 == 0)
       vetvalor2[i] = 0;
      else
       vetvalor2[i]=1;
valor2=valor2 / 2;


   }  /* for */
 } /*if (valor1>0)*/

   else{                 /*Se o número for negativo*/
    for (i=bits; i >= 0; i--){

      if (valor2 % 2 == 0)
       vetvalor2[i]=1;
      else
       vetvalor2[i]=0;
    valor2=valor2 / 2;
    vetvalor2[i]=vetvalor2[i]+np[15]+vaium;
        if(vetvalor2[i]==3 || vetvalor2[i]==1)t=1;else t=0;

           if((vetvalor2[i]==2)){
            vetvalor2[i]=0;
            vaium=1;
        }
        else
            if(vetvalor2[i]==3){
                vetvalor2[i]=1;
                vaium=1;
            }
            else
                vaium=0;
            }
       }


 printf("\n O segundo número convertido para binário é:   ");

  for (i=0; i <= bits; i++)
    printf("%d",vetvalor2[i]);

for (i=bits; i>=0; i--){
      soma[i]=vetvalor1[i]+vetvalor2[i]+vaium;

      if(soma[i]==3 || soma[i]==1)t=1;else t=0;
        if((soma[i]==2)){
            soma[i]=0;
            vaium=1;
        }
        else
            if(soma[i]==3){
                soma[i]=1;
                vaium=1;
            }
            else
                vaium=0;
    } /*for*/
    printf("\n A soma é:");
    for (i=0; i<=bits; i++)
        printf("%d",soma[i]);


return 0;
}

 

  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Carla Maria    seu código está bom , mas está mostrando o resultado errodo , então seu código com algumas modificações pode ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define bits 16
int main (){
    int valor1,                  /*armazena o primeiro número decimal informado pelo usuário */
        valor2,                  /*armazena o segundo número decimal informado pelo usuário*/
        vetvalor1[bits],         /*armazena o primeiro número convertido para binário*/
        vetvalor2[bits],         /*armazena o segundo número convertido para binário*/
        np[15],
        i,t,                     /*contadores*/
        vaium=0,                 /*armazena o vai um da soma dos binários*/
        soma[bits];              /*armazena a soma dos binários*/
    setlocale(LC_ALL,"");
    printf("         Conversão de Valores - Decimal x Binário         ");
    printf("\n ***************************************************** \n");
    np[15]=1;
    printf("\n Informe o primeiro número:");
    scanf("%d", &valor1);
    valor1 = abs(valor1);
    /* Transformando o primeiro número em binário */
    for (i=bits-1; i >= 0; i--){
        if (valor1 % 2 == 0)
            vetvalor1[i] = 0;
        else
            vetvalor1[i]=1;
        valor1=valor1 / 2;
    }
    printf("\n O primeiro número convertido para binário é:   ");
    for (i=0; i < bits; i++)
        printf("%d",vetvalor1[i]);
    printf("\n");
    printf("Informe o segundo número:");
    scanf("%d",&valor2);
    valor2 = abs(valor2);
    /* Transformando o segundo número em binário */
    for (i=bits-1; i >= 0; i--){
        if (valor2 % 2 == 0)
            vetvalor2[i] = 0;
        else
            vetvalor2[i]=1;
        valor2=valor2 / 2;
    }
    printf("\n O segundo número convertido para binário é:   ");
    for (i=0; i < bits; i++)
        printf("%d",vetvalor2[i]);
    for (i=0; i<bits; i++){
        soma[i] = vetvalor1[i]+vetvalor2[i]+vaium;
        if((soma[i]==2)){
            soma[i]=0;
            vaium=1;
        }
        else
            if(soma[i]==3){
                soma[i]=1;
                vaium=1;
            }
            else
                vaium=0;
    }
    printf("\n A soma é:");
    for (i=0; i<bits; i++)
        printf("%d",soma[i]);
    printf("\n\n");
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o número digitado pelo usuário vai ser do tipo int use 32 bits, ou melhor ainda ao invés de um #define, use int bits = 8 * sizeof(int); para ser consistente qualquer que seja o tamanho de int no sistema/compilador. (Se precisar que seja 16 bits use o tipo short int e %hd como especificador do scanf e printf para o número digitado pelo usuário)

 

Ao invés de numero % 2 use numero & 1 para obter 1 bit.

E ao invés de numero / 2 use numero >> 1 para eliminar o último bit.

Assim a conversão será feita corretamente tanto para números positivos quanto negativos.

 

Como o número negativo em binário vai estar em complemento de 2 (ex: -1decimal = 11111111 11111111 11111111 11111111binário com 32 bits) a soma dos números binários vai funcionar tanto para números positivos quanto negativos sem precisar fazer alteração.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×