Подтвердить что ты не робот

Что означает ключевое слово unsigned?

Я написал код на С++, чтобы показать символы ASCII на консоли, которые я нашел в книге, которую я читал. Код выглядел так:

#include <iostream>

using namespace std;

int main()  
{  
    for (unsigned char i = 32; i<128; i++)  
       cout << i;  
    int response;  
    cin >> response;  
    return 0;  
}

Когда я убираю ключевое слово unsigned и вместо этого использую signed, результаты становятся бесконечными, и ПК подает звуковой сигнал, пока я не отключу исполняемый файл. Но когда я использую переменную int i, вместо этого мне не нужно присваивать значение переменной. Почему это?

4b9b3361

Ответ 1

unsigned просто означает, что число не станет отрицательным. Да, число, потому что a char действительно всего 8-разрядное целое.

Итак, когда unsigned, каждый бит используется в неотрицательном диапазоне, который будет идти от 0 до 255. Когда вы опуститесь и используете signed (по умолчанию) char, диапазон будет идти от От -128 до 127, поэтому он всегда будет меньше 128 и перейдет в бесконечный цикл.

Звуковой сигнал, который вы слышите, обусловлен тем, что значение char значения 7 "напечатано".


An int, с другой стороны, даже если подпись проходит полностью от -2,147... миллиарды до +2,147 миллиарда, поэтому она будет итерировать до достижения 128 и останавливаться.

Ответ 2

Подписанный тип char находится в диапазоне от -128 до +127.

Следовательно, i<128 никогда не может быть ложным, поэтому ваш цикл никогда не завершится.

Вместо этого 127 + 1 в качестве подписанного char будет округлен до -128 (потому что он установит бит знака), который затем продолжит цикл через второй раз.

Эта вторая итерация будет включать в себя каждый символ, включая \a (звонок), который будет звучать при печати. ​​

Ответ 3

Unsigned означает, что переменная будет содержать только положительные значения, что означает, что они могут содержать более большие положительные числа. Диапазон unsigned char обычно составляет от 0 до 255, а диапазон подписанного char составляет от -128 до +127. Это может различаться на разных аппаратных средствах (но не на большинстве аппаратных средств, с которыми вы, вероятно, столкнетесь).

Когда переменная увеличивается от максимального значения, она переполняется. Что происходит с переменной, зависит от того, является она неподписанной или нет. Безподписанные типы гарантированно становятся 0, а тип подписанных - undefined. В большинстве систем, которые я видел, переменная обертывается до минимального значения (в данном случае -128), но вы не можете полагаться на это поведение.

Это означает, что переменная никогда не достигнет 128, поэтому цикл будет продолжаться вечно.

Если вы перешли на эту страницу и посмотрите на основные типы данных, вы можете увидеть типичные диапазоны подписанных vs без знака всех основных типов: http://www.cplusplus.com/doc/tutorial/variables/

Ответ 4

signed char диапазон от -128 до +127, поэтому он всегда будет меньше 128

Когда вы делаете

signed i=127;
i++;

i обычно будет -128 (но вы не можете рассчитывать на это поведение)

unsigned char диапазон от 0 до 255

Не все ASCII символы могут быть распечатаны! Это бессмысленно печатать их.

Ответ 5

Типы signed char и unsigned char представляют собой различные целые типы. Как следует из названий, один является подписанным типом (т.е. Может представлять отрицательные значения), а другой является неподписанным типом (т.е. Может представлять только неотрицательные значения).

Тип char, без префикса signed или unsigned, является еще одним отдельным типом. Он имеет то же представление и диапазон, что и signed char или unsigned char; какой из них является реализацией. (Тонкая точка: они все еще три различных типа, хотя два из них имеют одинаковые характеристики.)

Для типичных реализаций все три из этих типов - 8 бит, а подписанные типы представлены с использованием двух'-дополнений, давая signed char диапазон от -128.. +127 и unsigned char диапазон 0.. + 255.

В вашей реализации кажется, что plain char подписан (что очень часто). Поэтому, если i имеет тип char, то i < 128 всегда истинно, и у вас есть бесконечный цикл. И увеличение объекта char или signed char за его максимальное значение фактически имеет поведение undefined, но обычно оно обтекает от максимального значения до минимального значения, которое вы видите. (Звуковой сигнал, вероятно, возникает, когда напечатанный символ \007, символ ASCII BEL; либо это, либо вы отправляете управляющие символы, которые испортили ваш терминал.)

Создание i a unsigned char дает ему диапазон от 0 до 255, и ваш цикл останавливается, когда он достигает 128. (Приращение значения неподписанного типа за его максимальное значение хорошо определено, но вы не все равно.)

int всегда является подписанным типом, а его диапазон требуется для языка не менее -32767.. +32767. В наши дни это обычно 32 бита, с диапазоном -2147483648.. +2147483647. Но даже с минимальным требуемым диапазоном он больше, чем достаточно большой для вашей петли.

Ответ 6

Подписанный char (по крайней мере, в типичном случае) может представлять только значения от -128 до +127. Поскольку он никогда не может иметь значение 128, ваш цикл работает вечно.

Официально, когда у него есть значение 127, и вы увеличиваете его, результатом является поведение undefined. В действительности, практически на любой типичной машине (что-либо, использующее 2 дополнения), когда она имеет значение 127, и вы увеличиваете ее, она будет округлена до -128, увеличится до 127, обернется до -128 и пройдет весь цикл еще раз.

С unsigned char вы получаете значения от 0 до (по крайней мере) 255, поэтому, когда вы добираетесь до 127 и увеличиваете, значение переходит в 128, заканчивая цикл, как ожидалось.

Аналогично, для int требуется диапазон от, по меньшей мере, от -32767 до +32767. Поэтому, когда он имеет значение 127, и вы увеличиваете, результат будет равен 128, как вы обычно ожидаете.