кастинг подписан без подписи - PullRequest
5 голосов
/ 31 мая 2011

правильно ли это делать?

typedef unsigned int Index;

enum
{
  InvalidIndex = (Index) -1 
};

Я читал, что это небезопасно на разных платформах, но я видел это во многих "профессиональных" кодах ...

Ответы [ 4 ]

6 голосов
/ 31 мая 2011

То, что вы прочитали, было, вероятно, из страха, неуверенности и сомнения.Автор всего, что вы читали, вероятно, думал, что (unsigned)-1 был недостаточным и потенциально вызывал хаос в системах, где битовое представление не дает вам UINT_MAX для вашей проблемы.

Однако автор ошибаетсяпотому что стандарт гарантирует, что значения без знака будут переноситься, когда они достигнут границы своего диапазона.Независимо от того, какие битовые представления задействованы, (unsigned)-1 равно std::numeric_limits<unsigned>::max().Период.

Хотя я не уверен, какая польза от этого здесь.Вы получите это большое, максимальное значение ... Если это хорошо, я думаю, что вы можете пойти.

4 голосов
/ 31 мая 2011

Если вы хотите получить UINT_MAX, я уверен, что это лучший способ сделать это.Приведение -1 к unsigned гарантированно дает UINT_MAX.Это объясняется в комментариях.

2 голосов
/ 31 мая 2011

Это небезопасно, потому что перечисление неясно определено.

См. Являются ли перечисления C ++ подписанными или беззнаковыми? для получения дополнительной информации об этом.

В конце концов, то, что вы написали, выглядит так, как если бы оно было (int) (unsigned int) (int) в переводе, поэтому я не уверен, чего вы пытаетесь достичь.

0 голосов
/ 31 мая 2011

Не совсем уверен, определено ли это реализацией, но приведение -1 (которое, очевидно, со знаком) к целому числу без знака вызывает недостаточное значение, которое обычно приводит к очень большим значениям (например, INT_MAX).

...