Я пытался записать символ 255 ascii на консоль, но у меня есть бесконечный цикл
for(char i=0; i<256; i++) {
cout << i << ' ';
}
Так как i
никогда не может быть больше или равно 256
, Это переполнится перед этим. Помните, что это тип char
чье максимальное значение может быть 255
если это неподписанный, иначе 127
если это подписанный.
Будь то char
является неподписанный или же подписанный, определяется реализацией. Но обычно, по моему опыту, это подписано, что обычно означает максимальное значение char
может достичь 127
,
Так i
приращения от 0
в 127
затем становится -128
от которого оно увеличивается до 127
и так далее, хорошо, если это подписанный. Если это неподписанный, тогда это пойдет от 0
в 255
то дальше станет 0
(из-за переполнения), и история начинается снова и снова!
Так как все значения char
меньше 256
Для сравнения char
i
преобразуется в int
, что обычно приводит к значению от -128 до 127 (с 8-битным дополнением со знаком 2) char
s) или от 0 до 255 (включительно), если char
это 8-битный тип без знака.
Однажды максимальное значение char
удержание может быть достигнуто, дальнейшее увеличение приведет к циклическому изменению до 0, если char
без знака, и для преобразования, определенного реализацией int
значение 128, что приращение производится до char
когда он хранится обратно, обычно результат -128, когда char
подписан
Вы должны скомпилировать с предупреждениями о (-Wtautological-compare
по этому вопросу).
В C ++ каждый целочисленный тип имеет диапазон возможных значений. Этот диапазон (обычно) определяется реализацией, хотя на распространенных платформах (x86) часто приходится иметь:
signed char
в [-128, +127] (+)short
в [-2 *15, 2* 15-1]int
в [-2 *31, 2* 31-1]Если вы попытаетесь увеличить целочисленный тип со знаком сверх его максимального значения, вы вводите область неопределенное поведение. В распространенных реализациях это оборачивается (как и для типов без знака), поэтому 127 + 1 становится -128 (для char
).
Когда вы сравниваете с 256
вы сначала приводите значение из i
в int
(тип 256
без интегральных суффиксов), а затем выполните сравнение. Тем не менее, так как i
всегда находится в диапазоне [-128, 127] (+), он строго уступает 256
поэтому условие всегда верно.
(+) Это реализация, определенная ли char
подписано или нет, если char
является беззнаковым, тогда его диапазон более вероятен [0, 255].
Попробуй это!
for(int i=0; i<256; i++)
{
cout << char(i) << " ";
}