(1)
    unsigned int x = 1;
    char *p = (char *)&x;
    printf("%x %x %x %x\n", p[0], p[1], p[2], p[3]);

(2)
    unsigned int x = 1;
    char buf[256];
    char *p = buf;
    while (i < CHAR_BIT * sizeof (unsigned int)) {
        *p++ = x << i++ & ~(~0U >> 1) ? '1' : '0';
        if (i % CHAR_BIT == 0)
            *p++ = ' ';
    }
    *--p = '\0';
    printf("%s\n", p);


上の2種類の方法で x の値を表示させると、(1)は 1 0 0 0 、(2)は 00000000 00000000 00000000 00000001 と、
それぞれ別のバイトオーダーで表示されてしまいます。
どうしてこの様になってしまうのでしょうか?

コンパイラはgcc2.95.4です。