先写结论
#define MY_INT_MAX ( ~0u >> 1 ) //有符号整型的最大值
#define MY_UINT_MAX (~0) //无符号整型的最大值
#define MY_SHORT_MAX ( (unsigned short)~0 >> 1 ) //有符号短整型的最大值
#define MY_USHORT_MAX ( (short)~0 ) //无符号短整型的最大值
#define MY_INT_MIN (-MY_INT_MAX-1) //有符号整型最小值, 或者 (1 << 31)
#define MY_SHORT_MIN (-MY_SHORT_MAX-1) //有符号短整型最小值, 或者 (1 << 15)
正文
在刷leetcode的时候有一个需求,需要append一个代表无限大的数当作"哨兵节点", 于是在往上查询了一下, 有两个方法:
- 引入limits.h, 里面有各种不同类型的最大值对应的宏
- 直接数字表示, 例如0xFFFF或者65535代表unsigned short的最大值
其实也能用了, 不过我觉得会有敲错一个数字或者敲漏一个f的风险.
于是我想了下觉得利用"~"运算符取反其实还挺方便的.
int
最大值
是4字节*8位=32位, 直接打印了下~0, 结果为会把最后一位符号位的1也反转过来, 这很合理, 但是在做右移运算(~0 >>1)想把符号位的1去掉的时候, ~0代表32位全1, 由于默认是int类型, 恰好是1的补码, 即-1, -1右移还是-1,具体可以看下下面的链接 :
http://t.csdn.cn/zNAOT
所以应该来一个类型说明为无符号整型, 让最高位也能跟着一起右移, 那0后面跟个u就好了(~0u >> 1), 就是代表0x7FFF F