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; }