Что именно вычисляется в этом выражении и почему? - PullRequest
4 голосов
/ 22 февраля 2011
#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)

Я принимаю это так: заполняем регистр размером без знака int с единицами, затем стряхиваем MSB, получая максимальное значение для подписанного int. Это правильно? Кроме того, причина , почему они делают это таким образом, полностью уклоняется от меня, пожалуйста, просветите.

Ответы [ 2 ]

7 голосов
/ 22 февраля 2011

Вы можете переписать это как

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

, тогда вы заметите, что операция внутреннего сдвига совершенно бесполезна, поскольку ее единственный эффект - сдвинуть бит старшего разряда

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

, который, в свою очередь, является не чем иным, как

#define NP_MAXREADY (UINT_MAX/2)

Кроме того, что указано в другом ответе, это не INT_MAX, поскольку в первую очередь это - unsigned, поэтому тип отличается.Тогда представление signed против unsigned может иметь биты заполнения, поэтому вы никогда не можете быть уверены, что эти два значения имеют одинаковое значение.

7 голосов
/ 22 февраля 2011

Мы должны были бы увидеть код, который использует его, чтобы быть уверенным, но "максимальное значение целого числа со знаком" также будет моим предположением.

Что касается почему они делают это таким образом - вероятно, потому что они не знают о INT_MAX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...