Вот попытка сделать это в C. Это зависит от реализации, не имеющей битов заполнения:
#define IS_MAX_UNSIGNED(x) ( (sizeof(x)>=sizeof(int)) ? ((x)==-1) : \
((x)==(1<<CHAR_BIT*sizeof(x))-1) )
Или, если вы можете изменить переменную, просто сделайте что-то вроде:
if (!(x++,x--)) { /* x is at max possible value */ }
Редактировать: И если вас не волнуют возможные расширенные целочисленные типы, определенные реализацией:
#define IS_MAX_UNSIGNED(x) ( (sizeof(x)>=sizeof(int)) ? ((x)==-1) : \
(sizeof(x)==sizeof(short)) ? ((x)==USHRT_MAX) : \
(sizeof(x)==1 ? ((x)==UCHAR_MAX) : 42 )
Конечно, вы можете использовать sizeof(char)
в последней строке, но я считаю, что это запах кода и обычно ловит его на запах кода, поэтому я просто написал 1. Конечно, вы также можете просто полностью удалить последнее условие.