Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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;
}

 

Postado

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!