1、判断一个数是否是无符号数
#define ISUNSIGNED(a) (a>=0 && ~a>=0)
解析:(1)如果一个数小于0,则它是有符号数;
(2)如果一个数大于0,则对它按位取反(包括符号位),若仍大于0,则为无符号数,否则为有符号数。
2、判断一个类型是否是无符号类型
#define ISUNSIGNED(type) ((type)0 - 1 >0)
解析:1、根据C语言的类型自动提升原则,如果type是有符号的,则与1计算的结果是有符号的,计算过程不发生类型提升,结果小于0;
2、如果type是无符号的,则发生类型提升,1先转换为无符号类型,计算结果同样为无符号类型,结果大于0。