Ir ao conteúdo
  • Cadastre-se

Problema simples sobre campo de bits - C++


Ariel98

Posts recomendados

Olá pessoas.

 

Eu tenho uma dúvida, que eu acho que seja simples, sobre campo de bits em struct em C++. Segue o código:

 

#include <iostream>
#include <cstdlib>
using namespace std;
struct Bits{
	int bit1:1;
	unsigned:0;
	unsigned bit3:3;
	unsigned bit4:2;
}campo;
int main()
{
	campo.bit1 = 1;
	campo.bit3 = 1024>>8;
	campo.bit4 = 2048>>10;
	cout << campo.bit1 << " " << campo.bit3 << " " << campo.bit4 << endl;
	system("pause");
	return 0;
}

Bom, a ideia é prever a saída desse programa. Eu consegui entender (eu acho) a parte de deslocamento de bits e, segundo minhas contas, a saída deveria ser (1  4  2). Mas por algum motivo que eu não conheço o valor de campo.bit1 ficou com valor de -1, e a saída ficou (-1  4  2), sem os parênteses.

 

Alguém sabe me explicar porque do sinal negativo no campo.bit1? Eu só sei que isso tem relação com o fato de não ser unsigned, mas essa é a parte óbvia. Agradeço desde já.

 

(Qualquer coisa mal formatada, perdoem. É a primeira vez que uso o fórum :D)

Link para o comentário
Compartilhar em outros sites

UNSIGNED X SIGNED

 

      Independente do sistema e/ou arquitetura os atuais sistemas computadorizados

utilizam se de duas notações para números; unsigned quer dizer sem sinal,  signed

que convencionalmente não é declarado pois existe por padrão implícito e quer  nos

diz que, é com sinal, logo é o oposto de seu antagonista unsigned.

 

      Vamos adentrar um pouco mais na  memória  e  fazermos   uma representação

gráfica  de   byVal especificamente,  como  sendo  uma  variável  declarado  do  tipo

campo dentro das diretrizes impostas por sistemas 16 bits.

 

 

Matriz12 Dec. 08 15.17.jpg

 

A imagem acima nos ilustra o  momento  e  como função cout  interpreta  este  field

na memória. Quero dizer é um campo mais  no  instante  da tarefa de exibir  na  tela

se captura e a torna variável, assim sendo, toda variável inteira com sinal tem  o  pri-

meiro bit da sequência o indicador da existência de sinal negativo, "regra do 1 bit".

Quando declarado como sendo signed este bit sinaliza, ou seja é inteiro que  admite

negativo,   quando   explicitamente   declaramos   unsigned   estamos  dizendo para

o interpretador que está variável dever assumir valores somente positivos e ignore a

regra do 1º bit.

 

     Avaliando o problema acima, o único bit da sequência, e por tanto o primeiro é  1,

se não é definido unsigned, então será negativo, contrário será sempre positivo.

 

     

 

@Ariel98

Referencias / Leitura:

Arquitetura 16 bits.

[cout] Função exibir C++

Qual a finalidade do unsigned no C.

WIKIPEDIA: Binário Sinalizados 2016

 

 

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Mauro Britivaldo disse:

UNSIGNED X SIGNED

 

      Independente do sistema e/ou arquitetura os atuais sistemas computadorizados

utilizam se de duas notações para números; unsigned quer dizer sem sinal,  signed

que convencionalmente não é declarado pois existe por padrão implícito e quer  nos

diz que, é com sinal, logo é o oposto de seu antagonista unsigned.

 

      Vamos adentrar um pouco mais na  memória  e  fazermos   uma representação

gráfica  de   byVal especificamente,  como  sendo  uma  variável  declarado  do  tipo

campo dentro das diretrizes impostas por sistemas 16 bits.

 

 

Matriz12 Dec. 08 15.17.jpg

 

A imagem acima nos ilustra o  momento  e  como função cout  interpreta  este  field

na memória. Quero dizer é um campo mais  no  instante  da tarefa de exibir  na  tela

se captura e a torna variável, assim sendo, toda variável inteira com sinal tem  o  pri-

meiro bit da sequência o indicador da existência de sinal negativo, "regra do 1 bit".

Quando declarado como sendo signed este bit sinaliza, ou seja é inteiro que  admite

negativo,   quando   explicitamente   declaramos   unsigned   estamos  dizendo para

o interpretador que está variável dever assumir valores somente positivos e ignore a

regra do 1º bit.

 

     Avaliando o problema acima, o único bit da sequência, e por tanto o primeiro é  1,

se não é definido unsigned, então será negativo, contrário será sempre positivo.

 

     

 

@Ariel98

Referencias / Leitura:

Arquitetura 16 bits.

[cout] Função exibir C++

Qual a finalidade do unsigned no C.

WIKIPEDIA: Binário Sinalizados 2016

 

 

 

Muito obrigado, tioru a minha dúvida!

 

Como marca o tópico como resolvido...?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...