#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)
Run Code Online (Sandbox Code Playgroud)
我把它当作:用1填充寄存器大小的unsigned int,然后摆脱MSB,获得signed int的最大值.这是对的吗?此外,其原因为何,他们正在这样做这样的方式完全避开了我,请指教.
你可以改写为
#define NP_MAXREADY (((~0u)<<1)>>1)
Run Code Online (Sandbox Code Playgroud)
然后你会注意到内移操作完全没用,因为它的唯一作用是移出最高位
#define NP_MAXREADY ((~0u)>>1)
Run Code Online (Sandbox Code Playgroud)
而这又不过是
#define NP_MAXREADY (UINT_MAX/2)
Run Code Online (Sandbox Code Playgroud)
除了另一个答案中所说的,这不是INT_MAX,因为首先这里的这个是一个unsigned,所以类型是不同的.那么signed对比的表示unsigned可能有填充位,所以你永远不能确定这两个具有相同的值.