2010-04-27 2 views
6

У меня есть следующий код, и мне кажется, что он должен всегда вводить истинную часть оператора if, но, помимо 120, он начинает запускать предложение else. Почему это происходит?Почему выход этой программы изменяется на 130?

char x; 
for (i=0;i<256;i+=10) { 
    x=i; 
    if (x==i) 
     printf("%d true\n",i); 
    else 
     printf("%d false\n",i); 
} 

Выход:

0 true 
10 true 
: all numbers from 20 to 100 are true 
110 true 
120 true 
130 false 
140 false 
: all numbers from 150 to 230 are false 
240 false 
250 false 
+0

, что !? Я понятия не имею, о чем вы спрашиваете, потому что я не могу его прочитать. – wheaties

+3

Мне и Марку удалось легко определить, что было задано. Вопрос просто сформулирован плохо, это не то, что вы утверждаете в качестве причин для закрытия. –

+2

Я думаю, что формулировку можно улучшить довольно легко, но ее нельзя отредактировать, пока она закрыта, поэтому я голосую за повторное открытие. –

ответ

12

Ваш компилятор, вероятно, использует подписанный символ по умолчанию при использовании ключевого слова обугленного. Диапазон подписанного символа обычно составляет от -128 до 127, тогда как диапазон int намного больше. Другие эзотерические аппаратные средства, выходящие за пределы обычного настольного ПК, могут использовать другие значения.

+0

Это почти наверняка правильно для этого конкретного случая, но я хотел бы, чтобы было ясно, что это _is_ для этого конкретного случая. Ничто в стандарте C не указывает на 8-битный символ и не гарантирует, что целое число больше, чем символ. Кроме того, я думаю, вы имели в виду, что «диапазон символа _signed_ равен -128 ...». – paxdiablo

+2

На самом деле, чтобы избежать какой-либо двусмысленности, C99 указывает, что символ должен быть * не менее * 8 бит (5.2.4.2.1), и он гарантирует, что 'int' может содержать все значения от -32767 до +32767. Утверждение «диапазон int намного больше -128..127» технически справедливо. –

+0

@paxdiablo Спасибо, отредактировали то, что я на самом деле хотел сказать. Да, довольно легко предположить 8-битные символы. Я сделал это, но было мрачно известно, что это может быть не всегда так. Я решил, что эти осложнения не нужны на данном этапе уровня навыка op - и я собирался быстро исправить ошибку ++ ;-) –

13

Это потому, что вы используете подписанный символ и предположительно целое число.

Чувство переполнено, когда оно достигает 130 (оно становится 130 - 256), но целое число не переполняется. 130 - 256 = 130.

Простое изменение фиксирует это так, что результат всегда верно - просто добавьте unsigned на первой линии:

unsigned char x; 
for (int i=0;i<256;i+=10) 
{ 
    x=i; 
    if (x==i) 
     printf("%d true\n",i); 
    else 
     printf("%d false\n",i); 
} 
+3

И если код примера не делал шагов размером 10, то было бы гораздо более очевидным, что происходит, потому что это произошло бы на границе 127/128. – nategoose

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