#include <stdint.h> #include <sys/types.h> #include <sys/param.h> #define _DIAGASSERTMASK(t) (sizeof(t) < sizeof(intmax_t) ? \ (~((1ULL << (sizeof(t) * NBBY)) - 1)) : ~0ULL) #define _DIAGASSERTMIN(t) ((t)((1ULL << (sizeof(t) * NBBY - 1)))) #define _DIAGASSERTMAX(t) ((t)~((1ULL << (sizeof(t) * NBBY - 1)))) #define _DIAGASSERTU(t, a) (sizeof(t) < sizeof(intmax_t) ? \ (((a) & _DIAGASSERTMASK(t)) == 0) : 1) #define _DIAGASSERTS(t, a) ((a) < 0 ? \ ((a) >= _DIAGASSERTMIN(t)) : ((a) <= _DIAGASSERTMAX(t))) #define _DIAGASSERTFIT(t, a) _DIAGASSERT(_DIAGASSERTMIN(t) < 0 ? \ _DIAGASSERTS(t, a) : _DIAGASSERTU(t, a)) #include <stdio.h> int main(int argc, char *argv[]) { printf("long long=%llx %llx\n", _DIAGASSERTMIN(long long), _DIAGASSERTMAX(long long)); printf("int=%x %x\n", _DIAGASSERTMIN(int), _DIAGASSERTMAX(int)); printf("short=%hx %hx\n", _DIAGASSERTMIN(short), _DIAGASSERTMAX(short)); printf("char=%hhx %hhx\n", _DIAGASSERTMIN(char), _DIAGASSERTMAX(char)); printf("long long=%llx\n", _DIAGASSERTMASK(long long)); printf("int=%llx\n", _DIAGASSERTMASK(int)); printf("short=%llx\n", _DIAGASSERTMASK(short)); printf("char=%llx\n", _DIAGASSERTMASK(char)); printf("1=%d\n", _DIAGASSERTU(unsigned long long, 0xffffffffffffffffULL)); printf("0=%d\n", _DIAGASSERTS(long long , 0xffffffffffffffffLL)); printf("1=%d\n", _DIAGASSERTU(unsigned int, 0xffffffff)); printf("0=%d\n", _DIAGASSERTS(int, 0xffffffff)); printf("1=%d\n", _DIAGASSERTU(unsigned int, 0xffffffff)); printf("0=%d\n", _DIAGASSERTS(short, 0xffff)); printf("1=%d\n", _DIAGASSERTU(unsigned short, 0xffff)); printf("0=%d\n", _DIAGASSERTS(char, 0xff)); printf("1=%d\n", _DIAGASSERTU(unsigned char, 0xff)); printf("0=%d\n", _DIAGASSERTU(unsigned char, -1)); printf("1=%d\n", _DIAGASSERTS(char, -1)); return 0; }