2012-06-01 5 views
0

Можно создать дубликат:
Unsigned and signed comparison
unsigned int and signed char comparisonНевозможно войти в то время как заявление

У меня есть странное поведение, когда я пытаюсь войти в это время заявление:

unsigned u = 0; 
int i = -2; 

while(i < u) 
{ 
    // Do something 
    i++; 
} 

Но он никогда не входит, даже если когда я установить точку останова i = -2 и u = 0. Что я делаю неправильно? Как я могу это исправить?

ответ

6

Это потому, что стандарт ANSI C определяет, что всякий раз, когда проводится сравнение между квалифицированным (ваш unsigned int u) и неквалифицированным типом (ваш int i), неквалифицированный тип получает повышение до типа того же типа (таким образом, всегда int), но также наследует квалификаторы другой величины (т.е. она становится unsigned).

Когда int, значение которого равно -2, becames unsigned первый байт претерпевает преобразования: 0000 0010 -> 1111 1110. Ваш int теперь очень большое положительное число, конечно, больше вашего unsigned int.

Существует решение: приведение к signed

while(i < (signed) u) 
{ 
    // Do something 
    i++; 
} 

Кстати, вероятно, ваш компилятор должен дать вам предупреждение.

+0

Спасибо, +1 за решение с полным объяснением. – Nick

+0

Будет ли это работать, если вы определили i как '' 'signed int i'''? –

+0

По умолчанию, если мы не укажем 'signed' или' unsigned', большинство параметров компилятора будут принимать тип, который будет подписан, поэтому в этом случае 'signed int i' имеет тот же эффект' int i', и результат получается тоже самое. – gliderkite

2

Вы сравниваете целое число под знаком и без знака, и ваши проблемы начались там ...
Не делайте этого, и он должен работать нормально.

Смежные вопросы