#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;
}