Как заставить препроцессор использовать нужный тип данных в C / C ++? - PullRequest
1 голос
/ 06 марта 2012

Я хотел бы проверить размер бит без знака 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 или просто пропустите постфикс, он работает как положено.Может кто-нибудь объяснить, в чем здесь проблема, в чем причина и как ее можно решить?

1 Ответ

1 голос
/ 06 марта 2012

Препроцессор C не знает типов или ключевых слов C.

Арифметика препроцессора выполняется с наибольшим целочисленным типом из stdint.h, равным intmax_t или uintmax_t в зависимости от знака операндов.

...