2013-06-23 2 views
0

Я только что начал пересматривать свою статью типа данных. В настоящее время я изучаю концепцию подписанного и неподписанного характера. Я сомневаюсь, что подписанный символ имеет диапазон от -128 до 127, а затем почему приведенный ниже код все еще работает? Кроме того, приведенный ниже код дает бесконечное о/р, что непонятно для меня.Замешательство в выходе

main() 
{ 
char ch ; 
for (ch = 0 ; ch <= 255 ; ch++) 
printf ("\n%d %c", ch, ch) ; 
} 

В настоящее время я использую 32-разрядный компилятор GCC. Может ли кто-нибудь помочь мне в объяснении o/p вышеуказанного кода?

+0

http: //en.wikipedia.org/wiki/Integer_overflow –

+1

Почему это не должно запускаться? –

+4

Кроме того, причиной бесконечного цикла является то, что '127' всегда меньше 255. –

ответ

4
for (ch = 0 ; ch <= 255 ; ch++) 

Если ch является подписанный характер, он начинается с 0 и приращением до 127. Затем на следующем приращением, она будет «обтекать» и стать -128. Использование знакаchar:

127 = 0x7F 
128 = 0x80 

Но, используя подписал полукокса, 0x80 становится -128.

Так что теперь ch будет работать от -128 до 127. И так как все эти значения меньше 255, это будет повторяться, пока вы не остановите программу ..

+1

Спасибо за ваш быстрый ответ. Итак, согласно вам, приведенный выше код будет работать следующим образом: ch = 0 to ch = 127 ch = -128 to ch = 127 ch = -128 to ch = 127 и так далее, пока я не остановлю его. Верный ? –

+1

Да. Именно это происходит, когда я компилирую и запускаю его. –

0

Вы, вероятно, путают с выходом. Я думаю, что в o/p вы видите нечто подобное.

3 ...

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ...

33! 34 ".... 125} 126 ~ 127

... 511 512 513 .. и так далее

0 to 32 are all flags(unprintable codes) (следовательно, вы не видите выход , но только цифры для первых 33), followed by characters till 127.Как вы можете видеть, он обтекает каждые 255 символов, чтобы дать вам тот же результат but it actually stops printing characters after multiples of 127 (это список символов 127 - http://web.cs.mun.ca/~michael/c/ascii-table.html). Он просто сбрасывается после 127 до -128 , поэтому программа продолжает печатать числа до бесконечности, даже если она сбрасывает символ. Это происходит потому, что когда вы делаете printf("%d",ch) for -127 it prints 128, и так далее, пока ч = 255, а затем он переворачивается снова и начинает печать 256 года, и так далее, но фактическое значение ч никогда не поднимается выше 127 и, следовательно, она стремится к бесконечности

A signed char c вы должны предоставить вам вышеупомянутый выход. Символ по существу является целым числом 8 бит, но по умолчанию, вероятно, подписан на вашем компиляторе.

+0

Использование 'unsigned char ch' также будет бесконечно зацикливаться на' '=' '' '' '' '' '. – alk

+0

@alk Это правильно. Благодарю. Исправление исправлено. – Slartibartfast

1

Поскольку знак подписанный от -128 до 127, его двоичное число составляет 10000000 и 01111111. Когда «ch» работает до 127, следующий приращение «ch» станет -128, всегда меньше 255, поэтому он будет бесконечным o /п.