You are on page 1of 3

Campo de Bits en una estructura.

Veamos un cdigo que permite almancenar datos en campos de bits de una estructura.
int main()
{
cout<<"Tamanio entero sin signo: "<<sizeof(unsigned short)<<endl;
cout<<"Tamanio entero : "<<sizeof(int)<<endl;
struct fechas x[2];
int i;
int aux;
for (i=0;i<2;i++)
{
do{
cout<<endl<<"Ingrese dia: ";
cin>>aux; //aux, variable auxiliar

}while(!(aux>0 && aux<30));


x[i].dia=aux;

do{
cout<<endl<<"Ingrese Mes: ";
cin>>aux; //aux, variable auxiliar

}while(!(aux>0 && aux<13));


x[i].mes=aux;
}
cout<<endl<<"Los valores son: "<<endl;
for (i=0;i25;i++)
cout<<"Dia: "<<x[i].dia<<" "<<"Mes: "<<x[i].mes<<"Tamanio: "<<sizeof(x[i])<<endl;
}

Vemos que no es posible es leer valores de un campo de bits mediante cin. Para poder leer valores
desde el teclado se debe usar una variable entera auxiliar llamada aux, y posteriormente asignarla al
campo de bits. En esta asigancin se realiza un casting implcito, entre los bits del entero y los bits
que corresponden al campo de bits.

En este caso vemos que se pueden almacenar dos enteros ( mes, dia ) en una variable unsigned
short que para la mayora de los hardware son de 2 bytes.. pero solo ocupa un byte.
Si se hubiese almacenado en dos enteros, los valores da, mes ocuparan 8 bytes de memoria, 4 para
cada entero.
Vamos a modificar el cdigo como para que no valide el intervalo de los nros. Ingresados y vamos
a observar como son truncados en el 5to bit para el caso de Da, y en el 3er bit para el caso del mes.
Si ingresamos el nro. 6310 = 11 11112 , como el miembro dia de la estructura tiene 5 bits, el valor
almacenado ser 1 11112 que sera el 31 , para el caso del mes sera algo parecido.
Se ingresa 1510 (11112 ) y se almacena 710 (1112 ).
El cdigo sera:

#include<iostream>
using namespace std;
struct fechas {unsigned short dia:5;
unsigned short mes:3;
};

int main()
{
cout<<"Tamanio entero sin signo: "<<sizeof(unsigned short)<<endl;
cout<<"Tamanio entero : "<<sizeof(int)<<endl;
struct fechas x[2];
int i;
int aux;
for (i=0;i<2;i++)
{
cout<<endl<<"Ingrese dia: ";
cin>>aux;
x[i].dia=aux;
cout<<endl<<"Ingrese Mes: ";
cin>>aux;
x[i].mes=aux;
}
cout<<endl<<"Los valores son: "<<endl;
for (i=0;i<5;i++)
cout<<"Dia: "<<x[i].dia<<" "<<"Mes: "<<x[i].mes<<" Tamanio: "<<sizeof(x[i])<<endl;
}

La salida de este programa sera:


Tamanio entero sin signo: 2
Tamanio entero : 4
Ingrese dia: 63
Ingrese Mes: 15
Ingrese dia: 63
Ingrese Mes: 15

Los valores son:


Dia: 31 Mes: 7 Tamanio: 2
Dia: 31 Mes: 7 Tamanio: 2

A continuacin se deja para que el alumno analice un cdigo en el que para el mismo ingreso que en
el caso anterior (63,15) el resultado es el mismo y se almanecenan en un byte.

#include<iostream>
using namespace std;
struct fechas { unsigned char dia:5;
unsigned char mes:3;
};

int main()
{
cout<<"Tamanio entero sin signo: "<<sizeof(unsigned short)<<endl;
cout<<"Tamanio entero : "<<sizeof(char)<<endl;
struct fechas x[2];
int i;
int aux;
for (i=0;i<2;i++)
{
cout<<endl<<"Ingrese dia: ";
cin>>aux;
x[i].dia=aux;
cout<<endl<<"Ingrese Mes: ";
cin>>aux;
x[i].mes=aux;
}
cout<<endl<<"Los valores son: "<<endl;
for (i=0;i<2;i++)
cout<<"Dia: "<<static_cast <int> (x[i].dia)<<" "<<"Mes: "<<static_cast <int> (x[i].mes)<<" Tamanio:
"<<sizeof(x[i])<<endl;
}

You might also like