Печать ASCII в C

Я пытаюсь написать программу, которая будет печатать все символы ASCII, используя циклы for, но она продолжает работать в бесконечном цикле, пока я не уберу 127, я делаю что-то не так или так ведет себя ASCII?

Это приведет к сбою (бесконечный цикл):

#include <stdio.h>

int main (void)
{

for (char i = -128; i <= 127; i++)
{
    printf("%d = %c\n", i, i);
}

return 0;
}

Но это нормально:

#include <stdio.h>

int main (void)
{

for (char i = -128; i < 127; i++)
{
    printf("%d = %c\n", i, i);
}

printf("%d = %c\n", 127, 127);

return 0;
}

person user3109599    schedule 09.01.2014    source источник
comment
i <= 127 всегда истинно, если i является 8-битным типом char со знаком.   -  person Adam Rosenfield    schedule 10.01.2014
comment
Цикл от 0, а не -127, нет отрицательного значения ASCII-символа   -  person Joe DF    schedule 10.01.2014
comment
На ум приходит дополнение до двух.   -  person Ed Heal    schedule 10.01.2014
comment
взгляните на CHAR_MAX (из limits.h) и char c = CHAR_MAX; c++;. Должен дать вам подсказку о вашей проблеме.   -  person John Ledbetter    schedule 10.01.2014
comment
Какую версию компилятора вы используете и какие предупреждения включены? В идеале должно быть предупреждение компилятора о том, что i <= 127 всегда верно, и вам следует исследовать такие предупреждения на предмет возможных ошибок в вашем коде.   -  person Chris Culter    schedule 10.01.2014
comment
Обратите внимание, что сбой — это не то же самое, что бесконечный цикл. В первом случае ваша программа завершается аварийно. Во втором случае ваша программа будет успешно работать столько, сколько вы позволите.   -  person paddy    schedule 10.01.2014


Ответы (2)


Когда цикл достигает 127, ему разрешается продолжить. Затем 127 увеличивается на 1. Поскольку это signed char, выполняется перенос на -128, что по-прежнему соответствует условию зацикливания. На самом деле каждое значение signed char меньше или равно 127.

Более нормальным является использование большего типа данных, такого как int, для вашего цикла.

for (int i = 0; i < 256; i++) {
    printf("%d = %c\n", i, i);
}
person paddy    schedule 09.01.2014

Поскольку подписанный символ никогда не может быть больше, чем 127...

 #include <stdio.h>

int main (void) {
    printf("%d = %c\n", (char) 128, (char) 128);
    printf("%d = %c\n", (char) -128, (char) -128);
}

Выходы

-128 = �
-128 = �
person Elliott Frisch    schedule 09.01.2014