Я хотел бы проверить размер бит без знака long, используя макрос.Можно подумать, что если вы укажете 0UL
, он будет оцениваться как unsigned long, но в соответствии с этим коротким примером это не так.Я скомпилировал его, используя MinGW на 32-битной архитектуре, поэтому ~0UL
должен получить меня 0xFFFFFFFF
:
#if (((~0UL) >> 31) >> 1) // expected 0, double shift to get around mod 32 limit
#define UL_BIT_SIZE 64
#else
#define UL_BIT_SIZE 32
#endif
printf("%d, %X\n", UL_BIT_SIZE, ((~0UL) >> 31) >> 1);
Вывод: 64, 0
Забавно, что если я изменю UL
на L
или просто пропустите постфикс, он работает как положено.Может кто-нибудь объяснить, в чем здесь проблема, в чем причина и как ее можно решить?