У меня есть следующий код, и мне кажется, что это должно всегда вводить истинную часть if
оператор, но, вне 120, это, кажется, начинает выполняться else
пункт. Почему это происходит?
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
Ваш компилятор, вероятно, по умолчанию использует знаковый символ, когда вы используете ключевое слово char. Диапазон подписанного char обычно составляет от -128 до 127, тогда как диапазон int намного больше. Более эзотерическое оборудование, выходящее за рамки типичного настольного ПК, может использовать другие значения.
Это потому, что вы используете знаковый символ и предположительно целое число.
Символ переполняется, когда достигает 130 (становится 130 - 256), но целое число не переполняется. 130 - 256! = 130.
Простое изменение исправляет это так, что результат всегда истинный - просто добавьте беззнаковый
в первую строку:
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);
}