Ir para conteúdo
Fórum Script Brasil
  • 0

Binário (decimal negativo)


gellox

Pergunta

Pessoal imaginem a seguinte situação:

Possuo um arquivo binário que o seu conteúdo em 1(um) determinado byte ao converter para decimal deveria ser -10.

Eu consigo ler todos os bytes positivos, porém quando o valor e negativo ele não me retorna o valor exato.

Já li muito e ouvir falar algo sobre complemento de 2 (dois) e/ou sinal de magnitude.

Alguém poderia me ajudar ??

Obrigado

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Isso depende de como esse byte precisa ser interpretado Tem vários jeitos de fazer, implementei duas maneiras: a primeira usando uma variável char para a leitura e a segunda uma variável int. Mas, repito, há outros modos de se fazer isso.

Ler sobre o complemento de dois é útil, porque é desse modo que números negativos são armazenados. Essa técnica faz os números negativos terem uma coleção de um ou mais bits setados (1) na parte mais significativa de sua representação binária.

Exemplo:

-10 com 1 byte (char): 11110110

-10 com 4 bytes (int): 11111111111111111111111111110110

Ler um -10 de um byte em uma variável int resultaria em:

00000000000000000000000011110110 (246d)

por isso a conversão:

37    info2 = (char)info2;
é necessária. Código:
#include <stdlib.h>
#include <stdio.h>

#define FPATH "1dat"

int main(void)
{
  char info1;
  int info2 = 0;
  FILE *fptr = fopen(FPATH, "rb");

  if (!fptr) {
    signed char outbyte = -37;

    fprintf(stderr, "Imposivel abrir arquivo.\nTentando criar arquivo...\n");
    fptr = fopen(FPATH, "wb");
    if (!fptr) {
      fprintf(stderr, "Impossivel criar o arquivo. Terminando\n");
      exit(0);
    }
    fwrite(&outbyte, 1, 1, fptr);
    fclose(fptr);
    fprintf(stderr, "Arquivo criado.\n");

    fptr = fopen(FPATH, "rb");
    fprintf(stderr, "\n");
  }

  printf("Lendo para variavel tipo char:\n\t");
  if (fread(&info1, 1, 1, fptr))
    printf("Inteiro lido: %d\n", info1);
  else fprintf(stderr, "Arquivo vazio.\n");
  
  fseek(fptr, 0, 0);
  printf("Lendo para variavel tipo int:\n\t");
  if (fread(&info2, 1, 1, fptr)) {
    info2 = (char)info2;
    printf("Inteiro lido: %d\n", info2);
  }
  else fprintf(stderr, "Arquivo vazio.\n");

  fclose(fptr);

  getchar();
  return 0;
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...