gellox Postado Janeiro 24, 2013 Denunciar Share Postado Janeiro 24, 2013 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 == Douplus == Postado Fevereiro 24, 2013 Denunciar Share Postado Fevereiro 24, 2013 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): 11111111111111111111111111110110Ler 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
gellox
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
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.