Archivo del sitio

Apuntadores en C. Recorrer variable int como si fuera un arreglo char

El capítulo 5, del libro “El Lenguaje de programación C” de K&R dice en la página 103:

“Una situación común es que cualquier byte puede ser un char, un par de celdas de un byte pueden tratarse como un entero short, y cuatro bytes adyacentes forman un long.”

Partiendo de esta idea, podemos considerar que si una variable es de tipo int, su tamaño aproximado será de 4 bytes (32 bits). En C los tipos de datos nos ayudan a darle interpretación a los bits (trata estos bits como int, char, float, double, etc).

Una variable de tipo int, de 4 bytes de largo (tamaño variable dependiendo de la implantación) se puede representar por 32 bits:

00000000 00000000 00000000 00000000

Entonces, si de alguna manera pudieramos recorrer esos bits byte por byte e interpretarlos como tipo char, podríamos almacenar letras en ese entero y recorrerlo como un arreglo.

Una variable de tipo char se vería como 8 bits:

0000000

Si recordamos, el código ASCII es una tabla en la cual podemos representar letras, es un estándar. En ASCII necesitamos 8 bits, de los cuales por lo general solo se usan 7 para los caracteres imprimibles.

En ASCII, los valores para las letras empiezan a partir del byte con valor decimal 65 (en Hex equivale a 0x41):

01000001

Entonces, que tal si en nuestra variable int, almacenamos un número como esto:

DECIMAL: 1094861636

HEX: 0x41424344

BINARIO: 01000001 01000010 01000011 01000100

ASCII: A B C D

Teniendo un numero binario de esa forma, podríamos recorrerlo con un apuntador de tipo char, que recorra byte por byte e imprima en pantalla la letra respectiva … después de todo, son solo bits, lo importante es como los interpretamos.

El código quedaría como:

#include <stdio.h>

int main(void)
{
    int c = 0;
    c = 0x41424344;
    printf("%d\n", c);
    char *d = (char *) &c;
    
    printf("%c\n", *(d));
    printf("%c\n", *(d + 1));
    printf("%c\n", *(d + 2));
    printf("%c\n\n", *(d + 3));
    
    printf("%c\n", d[0]);
    printf("%c\n", d[1]);
    printf("%c\n", d[2]);
    printf("%c\n", d[3]);
    
    return 0;
}