リトルエンディアンとビッグエンディアンを試すコード

リトルエンディアンとビッグエンディアンの違いとかを説明するために簡単なコードを作った。

#include <stdio.h>

typedef struct s_data {
    unsigned char a;
    unsigned char b;
    unsigned char c;
    unsigned char d;
} t_data;

int main() {
    unsigned int n = 42;

    t_data *data_ptr = &n;
    unsigned int *int_ptr = &n;

    printf("sizeof(*int_ptr): %zu\n", sizeof(*int_ptr));
    printf("sizeof(*data_ptr): %zu\n", sizeof(*data_ptr));

    printf("a: %d, b: %d, c: %d, d: %d\n", data_ptr->a, data_ptr->b, data_ptr->c, data_ptr->d);
    printf("int: %d\n", *int_ptr);

    data_ptr->a = 0;
    data_ptr->b = 0;
    data_ptr->c = 0;
    data_ptr->d = 42;

    printf("a: %d, b: %d, c: %d, d: %d\n", data_ptr->a, data_ptr->b, data_ptr->c, data_ptr->d);
    printf("int: %d\n", *int_ptr);
}

4byteの構造体を作って、unsigned int型の1byteずつを取り出して、中身を確認するコード。

❯ gcc main.c && ./a.out
main.c:13:10: warning: incompatible pointer types initializing 't_data *' (aka 'struct s_data *') with an expression of type 'unsigned int *'
      [-Wincompatible-pointer-types]
        t_data *data_ptr = &n;
                ^          ~~
1 warning generated.
sizeof(*int_ptr): 4
sizeof(*data_ptr): 4
a: 42, b: 0, c: 0, d: 0
int: 42
a: 0, b: 0, c: 0, d: 42
int: 704643072