• 0
Sign in to follow this  
gellox

Binário (decimal negativo)

Question

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

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this