Сравните int и unsigned int - PullRequest
       1

Сравните int и unsigned int

10 голосов
/ 23 ноября 2011

Если нужно сравнить int x с unsigned int y, который безопаснее / лучше / лучше в C99 и gcc 4.4+:

  1. (unsigned int)x == y
  2. x == (int)y

Имеет ли это значение?

Ответы [ 2 ]

16 голосов
/ 23 ноября 2011

Безопаснее всего проверить, что число находится в диапазоне перед кастом:

if (x >= 0 && ((unsigned int)x) == y)
7 голосов
/ 23 ноября 2011

Да, это важно.

На платформе с 32-битной int, например,

int x = -1;
unsigned y = 0xffffffff;

выражение x == y даст 1, потому что через «обычные арифметические преобразования» значение x преобразуется в unsigned и, таким образом, в 0xffffffff.

Выражение (unsigned int)x == y также равно 1. Единственное отличие состоит в том, что вы выполняете преобразование явно с использованием приведения.

Выражение x == (int)y, скорее всего, также будет 1, потому что преобразование 0xffffffff в int дает -1 на большинстве платформ (два отрицательных дополнения). Строго говоря, это поведение, определяемое реализацией, и поэтому оно может различаться на разных платформах.

Обратите внимание, что ни в одном из случаев вы не получите "ожидаемый" результат 0. Хорошая реализация дана в ответе Mark Byers .

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