在这个表达式中究竟计算了什么,为什么?

Fre*_*ing 4 c

#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)
Run Code Online (Sandbox Code Playgroud)

我把它当作:用1填充寄存器大小的unsigned int,然后摆脱MSB,获得signed int的最大值.这是对的吗?此外,其原因为何,他们正在这样做这样的方式完全避开了我,请指教.

Blu*_*eft 7

我们必须看到使用它的代码才能确定,但"有符号整数的最大值"也是我的猜测.

至于为什么他们这样做 - 可能是因为他们不知道INT_MAX


Jen*_*edt 7

你可以改写为

#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可能有填充位,所以你永远不能确定这两个具有相同的值.