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

时间:2011-02-21 23:52:15

标签: c

#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)

我把它当作:用1填充寄存器大小的unsigned int,然后摆脱MSB,获得signed int的最大值。这是对的吗?另外,为什么他们这样做的原因完全躲避了我,请指教。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:7)

您可以将其重写为

#define NP_MAXREADY (((~0u)<<1)>>1)

然后你会注意到内移操作完全没用,因为它唯一的作用是移出最高位

#define NP_MAXREADY ((~0u)>>1)

反过来

#define NP_MAXREADY (UINT_MAX/2)

除了另一个答案中所述,这不是INT_MAX,因为首先这里的这个是unsigned,所以类型不同。然后signedunsigned的表示可能有填充位,因此您永远无法确定这两个具有相同的值。