C 64bitでのシフトが怖い

amd64環境下ではまったのでメモ

#include "stdlib.h"

void printx(unsigned long x) {
    printf("0x");
    for(int i = sizeof(x) * 8 - 1; i >= 0; --i) {
        printf("%d%s", (x >> i) & 0x1 ? 1 : 0, i % 8 == 0 ? " " : "");
    }
    printf("\n");
}

int main {
    //printx(0x1<<32); // warning: shift count >= width of type

    for(int i = 30; i <= 34; ++i) {
        printf("0x1 << %d : ", i);
        printx(0x1 << i); // i>=32, but no warning!
    }
    //0x1 << 30 : 0x00000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000
    //0x1 << 31 : 0x11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000
    //0x1 << 32 : 0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
    //0x1 << 33 : 0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010
    //0x1 << 34 : 0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100

    for(int i = 30; i <= 34; ++i) {
        printf("0x1 << %d : ", i);
        printx((i % 2 ? (unsigned long)0x1 : 0x1UL) << i);
    }
    //0x1 << 30 : 0x00000000 00000000 00000000 00000000 01000000 00000000 00000000 00000000
    //0x1 << 31 : 0x00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
    //0x1 << 32 : 0x00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000
    //0x1 << 33 : 0x00000000 00000000 00000000 00000010 00000000 00000000 00000000 00000000
    //0x1 << 34 : 0x00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000000

    return 0;
}