Ir ao conteúdo
  • Cadastre-se

C++ Como é representado o número -128 em binário, quando leio o byte do PC vem ele


kleberaugus

Posts recomendados

  Seguinte, estou com uma dúvida que agora só os universitários para me ajudar: Quando leio uma stream de um arquivo, olho byte a byte qual byte está vindo, como ele é colocado em um buffer de char, o byte vem como um número em inteiro penso eu como um possível número da tabela ascii.

  A tabela ascci imaginei que iria até o número 127 justamente para caber os números de 0 a 127 em um byte, nessa leitura que eu fiz também vem números negativos que eu resolvo colocando 1 no dígito mais significativo, porém veio um número que ferrou todo meu programa: -128.

  Como eu representaria o número -128 em apenas 1byte?

  É que é assim: os bytes chegam via stream em inteiro, eu transformo eles em binário (em string) trato eles e volto a grava-los como inteiro, nesse primeiro momento não estou tratando os dados, apenas estou convertendo, desconvertendo e gravando o mesmo arquivo para ver se a lógica do conversor está correta. Estando tudo correto o arquivo original deveria ter sua réplica.

  Após vários testes, olhei os binários do arquivo original e comparei com o gerado: o único erro é no byte representado pelo número -128!

  Poderia simplesmente passar a representar todos números por 9 bits (para sinalizar o número 128), mas acho estranho, o computador não deveria representar seus bytes por 8 bits???

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 minutos atrás, kleberaugus disse:

A tabela ascci imaginei que iria até o número 127 justamente para caber os números de 0 a 127 em um byte

 

Houve uma época em que sequer tinha minúsculas, depois foi até 127 depois nos 80 passou a 255 com o extended ascii

 

10 minutos atrás, kleberaugus disse:

como ele é colocado em um buffer de char, o byte vem como um número em inteiro penso eu como um possível número da tabela ascii

 

sugiro usar unsigned char e usar de de 0 a FF mesmo

 

Com sinal qualquer número a partir de 0x7F será negativo, certo? e o primeiro deles seria esse aí, 0x80.

 

12 minutos atrás, kleberaugus disse:

eu transformo eles em binário (em string)

 

seria um char* imagino

14 minutos atrás, kleberaugus disse:

o computador não deveria representar seus bytes por 8 bits???

 

Acho que deve usar mesmo unsigned e esquecer isso. 

 

Mas de todo modo considere que de 0 a 255 são 256 valores, de 1 a 127, de -1 a -127, o 0 e um outro que seria o -0 ou o -128, com o valor 0x80.

 

Poste aqui a conversão que está fazendo...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@arfneto  Estou fazendo o buffer pegar de um em um bit para poder converter  kkkkkkk

 

Aqui eu transformo os bytes de decimal para binário, guardando na string binário, depois eu concateno os zeros que faltam mas acho que essa parte não interessa por aqui.

somaBinInt = buffer[0];


            if (somaBinInt == 0) { binario = "000000000"; }

            if (somaBinInt > 0) {
                positivo = somaBinInt;
                while (positivo > 0) {
                    binario = to_string(positivo % 2) + binario;
                    positivo /= 2;
                }//fim do while
            }//fim do if
            else if (somaBinInt < 0) {
                negativo = somaBinInt;
                negativo = negativo * (-1);
                while (negativo > 0) {
                    binario = to_string(negativo % 2) + binario;
                    negativo /= 2;
                }//fim do while
            }//fim do else if

Depois para desconverter (converter novamente para decimal) eu converto cada caractere da String binário em inteiro e faço os devidos cálculos para transformar binário em decimal:

 

a1 = binario[0] - '0';//-'0' para converter caractere em inteiro
            a2 = binario[1] - '0';
            a3 = binario[2] - '0';
            a4 = binario[3] - '0';
            a5 = binario[4] - '0';
            a6 = binario[5] - '0';
            a7 = binario[6] - '0';
            a8 = binario[7] - '0';
            a9 = binario[8] - '0';
 binario.clear();
            intermediario = a1 * 256 + a2 * 128 + a3 * 64 + a4 * 32 + a5 * 16 + a6 * 8 + a7 * 4 + a8 * 2 + a9;
            resultado = a2 * 128 + a3 * 64 + a4 * 32 + a5 * 16 + a6 * 8 + a7 * 4 + a8*2 + a9;

            if (intermediario > 128) { resultado = resultado * (-1); }
            




            buffer[0] = resultado;

Parece simples, mas levei 4 dias pra fazer isso funcionar perfeitamente!

 

É duro aprender pela internet, muita informação incompleta e mesmo os livros não ajudam muito! Se não fossem os fóruns!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

20 minutos atrás, kleberaugus disse:

É duro aprender pela internet, muita informação incompleta e mesmo os livros não ajudam muito

 

Não seja maldoso com os livros... Em geral eles são amigos. De que livro está falando?

 

Em relação ao seu código

 

Talvez tenha tido mais trabalho do que o necessário. 
 

Você entendeu o que eu disse sobre usar unsigned char para o buffer? Usando sinal você só criou um problema. O (-0) é de fato uma aberração. Talvez não devesse ser válido e a linguagem ter ficado com -127 a +127 e dois 0.

 

Mas o que você pode fazer é tratar os bits ao invés de fazer as contas. Usando lógica e não aritmética.

Usando constantes como 0x80, 0x40, 0x20 e 0xF e tal. E usando operadores lógicos como & |  ^ e ~ e os shift como <<4 e >>4 ou >>1.

 

Assim você pode copiar só um bit para sua string sem fazer contas nem para gravar nem para restaurar o número. E é muito rápido. Muito mais rápido que aritmética... Faça um programa de teste ou pergunte se ficou em dúvida

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

10 minutos atrás, kleberaugus disse:

Fui ler sobre streams no livro do Deitel, ao acabar de ler você sabe como tudo funciona internamente, só não sabe escrever um código que funcione

:)

E qual livro você leu que faz você achar que sabe como funciona tudo internamente? É caro? Queria ler esse!

 

Talvez você não saiba julgar que "sabe como tudo funciona internamente". Veja que postou um tópico num forum sobre representação interna de inteiros.

 

Você entendeu o que expliquei sobre os operadores e como seriam uma alternativa para escreveu seu programa?

 

Link para o comentário
Compartilhar em outros sites

@arfneto

13 minutos atrás, arfneto disse:

 

Você entendeu o que eu disse sobre usar unsigned char para o buffer? Usando sinal você só criou um problema. O (-0) é de fato uma aberração. Talvez não devesse ser válido e a linguagem ter ficado com -127 a +127 e dois 0.

 

Mas o que você pode fazer é tratar os bits ao invés de fazer as contas. Usando lógica e não aritmética.

 

Tratar os bits ao invés de fazer contas: interessante, vou pesquisar a respeito.

 

Sim, mas agora o problema já foi resolvido... lembro de ter usado unsigned char e ter tido problemas para converter para ele... mas vou testar, é bem melhor mesmo.

 

Testando aqui:

in.read(buffer, bloco);

quando coloco como unsigned char a parte de escrita e leitura diz que um argumento unsigned char não é compatível com parâmetro char. ->erro na palavra buffer.

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, kleberaugus disse:

Tratar os bits ao invés de fazer contas: interessante, vou pesquisar a respeito

 

Use o que eu te escrevi e faça um programa de teste. Os operadores são só esses e a lógica você já sabe. Vai pesquisar como uma coisa assim? E já tem a resposta.  Use os operadores de bit para separar os bits e coloque na string sem calcular nada. Eles são zero ou 1, ou 48 ou 49 como queira representar. 

 

3 minutos atrás, kleberaugus disse:

lembro de ter usado unsigned char e ter tido problemas para converter para ele

 

Que seria um problema para converter? C converte qualquer coisa.

 

image.png.41654bc8e56d29d358c5259167748f04.png

 

O IDE que usa não mostra os protótipos? Algo assim:

 

image.png.5a8c5736c22c44d39d4407421316fe68.png

 

istream::read() espera char*

 

 

Link para o comentário
Compartilhar em outros sites

@arfneto

5 minutos atrás, arfneto disse:

:)

E qual livro você leu que faz você achar que sabe como funciona tudo internamente? É caro? Queria ler esse!

 

  Calma, só estava sendo sarcástico, de certa forma o livro ensina bastante coisa, mas nada prático, viajei na parte de stream! E eu não disse que sei, só quis dizer que não sei!

 

Li na biblioteca virtual que minha facul oferece.

livro.png

adicionado 15 minutos depois

@arfneto

13 minutos atrás, arfneto disse:

 

istream::read() espera char*

 

 

Isso significa que eu não posso usar unsigned char?

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

 Valeu @arfneto, sua ajuda foi fundamental pro progresso do meu projeto pessoal (é a falta do que fazer com a vontade de fazer), você deve ter percebido que eu não sei nada, no máximo estudei lógica de programação (onde só aprendi sobre condicional, laço de repetição e função), há vários anos estou obcecado em construir um compactador (deve ser porque já gastei muito dinheiro com disco de backup rsrsrs) mesmo sem saber nada vou pegando uma informação aqui, outra ali e vou botando a mão na massa.

  Quanto ao algoritmo do meu compactador, já tentei de diversas formas, sempre achava que funcionaria mas sempre chegava em alguma situação que o inviabilizava, agora cheguei em uma nova solução para ele e espero não encontrar nenhum percalço, pelos testes iniciais parece que agora vai!

  Nas primeiras tentativas estava usando Java, só que como estou aprendendo C na facul resolvi ir por esse caminho...

  A maior dificuldade inicial você matou para mim, que era saber como escrever e ler um arquivo, e ainda deu dica de como otimizar o código, muito bom mesmo! Sem você não sei se seria possível... agora para implementar meu algoritmo ficou mais fácil, só manipular strings ou como você indicou, manipular os bits diretamente.

  Muito obrigado!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

36 minutos atrás, kleberaugus disse:

Quanto ao algoritmo do meu compactador, já tentei de diversas formas, sempre achava que funcionaria mas sempre chegava em alguma situação que o inviabilizava, agora cheguei em uma nova solução para ele e espero não encontrar nenhum percalço, pelos testes iniciais parece que agora vai!

 

:) Muito bem. Bom que funcionou.

 

Sugiro que escreva um programa para extrair os bits e depois colocar de volta num char usando aqueles operadores.

 

Em relação a um compactador provavelmente a maior chance de sucesso está na análise de frequência de símbolos, letras ou palavras todas. E se forem números pode usar BCD como era em COBOL e roda em java, para compactar os números.

 

Tem uns algoritmos baseados em RLE que você pode usar --- run length encoded --- tipo o zip ou rar que tem bons índices também de compressão.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@arfneto

4 minutos atrás, arfneto disse:

Em relação a um compactador provavelmente a maior chance de sucesso está na análise de frequência de símbolos, letras ou palavras todas.

  Quero fazer algo original, ou se não for original, pelo menos alguma coisa que saiu da minha cabeça... O meu algoritmo pega sequencias de 0 e 1 e diminui um bit dele... por exemplo: 111 vira 11, 00 vira 0 e faço uma jogadinha pra diferenciar cada número, eu sei quais são os números e quais números devem ser acrescentados! A única situação que o algoritmo não funciona inicialmente é quando tem mais 0 e 1 isolados do que em conjunto, por exemplo: 01010101.

  Vamos ver que bicho vai dar! O único jeito de saber é fazendo!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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!