Comment convertir un tableau struct en char en C

Je suis en train de convertir en une structure de type char tableau à envoyer sur le réseau. Cependant, je reçois un peu bizarre de sortie à partir du char tableau lorsque je fais.

#include <stdio.h>

struct x
{
   int x;
} __attribute__((packed));


int main()
{
   struct x a;
   a.x=127;
   char *b = (char *)&a;
   int i;
   for (i=0; i<4; i++)
      printf("%02x ", b[i]);
   printf("\n");
   for (i=0; i<4; i++)
      printf("%d ", b[i]);
   printf("\n");
   return 0;
}

Voici les résultats pour différentes valeurs de un.x (sur un système X86 à l'aide de gcc):
127:
7f 00 00 00
127 0 0 0

128:
ffffff80 00 00 00
-128 0 0 0

255:
ffffffff 00 00 00
-1 0 0 0

256:
00 01 00 00
0 1 0 0

Je comprends les valeurs de 127 et 256, mais pourquoi les numéros de changement lorsque l'on va à 128? Pourquoi ne serait-il pas simplement être:
80 00 00 00
128 0 0 0

Suis-je oublier de faire quelque chose dans le processus de conversion ou suis-je oublier quelque chose au sujet de représentation entière?

*Note: Ceci est juste un petit programme de test. Dans un vrai programme, j'ai plus dans la structure, mieux les noms de variables, et je convertir pour little-endian.
*Edit: mise en forme

source d'informationauteur falcojr