Convertir entero a binario con uniones y campos de bit

Iniciado por geeke, 11 Abril 2015, 23:57 PM

0 Miembros y 1 Visitante están viendo este tema.

geeke

Hola a todos, tengo un inconveniente a la hora de intentar entender el siguiente código

#include <stdio.h>

typedef union
{
    int entero;
    struct
    {
        unsigned short : 7;
        unsigned short valor: 1;
    } bin;
} conversor;

int main(void)
{
    int numero = 8, i;
    conversor conver;
    conver.entero = numero;

    for ( i = 0; i < 8; i++ )
    {
        printf( "%d", conver.bin.valor );
        conver.entero <<= 1;
    }
    printf( "\n" );

    return 0;
}


Seria alguien tan amable de explicarme como convierte este código un numero entero a binario y también que hace cada miembro de la unión por ejemplo

unsigned short : 7;

Para que sirve esto?

Blaster

Suponiendo que int es de 4 bytes y short es 2 conversor tendría el siguiente aspecto :

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // <- conversor union
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // <- int entero
                XXXXXXXXXXXXXXXX // <- struct bin
                         XXXXXXX // <- campo sin nombre
                        X        // <- valor


Su código establece entero a 8, que se verá así :

00000000000000000000000000001000

Luego se imprime el valor contenido en conver.bin.valor el cual mostrara el octavo bit que es cero, seguidamente desplazamos entero un bit a la izquierda resultando

00000000000000000000000000010000

Este proceso se repetirá 8 veces, pero cuando i sea igual a tres valor se establecerá a uno, en ese momento ocho sera desplazado cuatro posiciones a la izquierda dando lugar a 128 que en binario es 10000000

Como seguramente ya te has dado cuenta, el campo de bits sin nombre (unsigned short : 7;) sirve como 7 bits de relleno, de manera que a valor le corresponda el octavo bit

Un Saludo


geeke

Hola Blaster  ;-) excelente explicación la tuya de verdad muchas gracias por tomarte el tiempo en explicar en detalle

Saludos