Дима, привет!
Только это смог изобразить, поэтому смену знаковости аргумента не отловит :
Код
#define MAX_UNSIGNED(X) \
((sizeof(X) == 1)? 0xffU : \
(sizeof(X) == 2)? 0xffffU : \
(sizeof(X) == 4)? 0xffffffffUL : 0U)
#define MAX_SIGNED(X) \
((sizeof(X) == 1)? 0x7f : \
(sizeof(X) == 2)? 0x7fff : \
(sizeof(X) == 4)? 0x7fffffffL : 0L)
#define MIN_UNSIGNED(X) 0U
#define MIN_SIGNED(X) \
((sizeof(X) == 1)? -128 : \
(sizeof(X) == 2)? -32768 : \
(sizeof(X) == 4)? -2147483648L : 0L)
Ещё немного подумал и нашёл решение для gcc!
Код
#define IS_UNSIGNED(X)\
({ \
const typeof(X) __x = 0; \
const typeof(X) __y = __x-1; \
(__y>0); \
})
#define MIN_OF_TYPE(X) ((IS_UNSIGNED(X))? MIN_UNSIGNED(X) : MIN_SIGNED(X))
#define MAX_OF_TYPE(X) ((IS_UNSIGNED(X))? MAX_UNSIGNED(X) : MAX_SIGNED(X))
И ещё немного подумал и для gcc написал ещё проще:
Код
#define MAX_OF_TYPE(X) \
((__builtin_types_compatible_p(typeof(X), int8_t))? (int8_t)0x7f : \
(__builtin_types_compatible_p(typeof(X), int16_t))? (int16_t)0x7fff : \
(__builtin_types_compatible_p(typeof(X), int32_t))? (int32_t)0x7fffffff : \
(__builtin_types_compatible_p(typeof(X), uint8_t))? (uint8_t)0xff : \
(__builtin_types_compatible_p(typeof(X), uint16_t))? (uint16_t)0xffff : \
(__builtin_types_compatible_p(typeof(X), uint32_t))? (uint32_t)0xffffffff : 0)
#define MIN_OF_TYPE(X) \
((__builtin_types_compatible_p(typeof(X), int8_t))? (int8_t)0x80 : \
(__builtin_types_compatible_p(typeof(X), int16_t))? (int16_t)0x8000 : \
(__builtin_types_compatible_p(typeof(X), int32_t))? (int32_t)0x80000000 : \
(__builtin_types_compatible_p(typeof(X), uint8_t))? (uint8_t)0x00 : \
(__builtin_types_compatible_p(typeof(X), uint16_t))? (uint16_t)0x0000 : \
(__builtin_types_compatible_p(typeof(X), uint32_t))? (uint32_t)0x00000000 : 0)