В чем разница между подписанным и unsigned int

В чем разница между подписанным и unsigned int?

    Как вы, вероятно, знаете, int s хранятся внутри двоично. Как правило, int содержит 32 бита, но в некоторых средах может содержать 16 или 64 бита (или даже другое число, обычно, но не обязательно равное двум).

    Но для этого примера давайте посмотрим на 4-битные целые числа. Крошечный, но полезный для иллюстративных целей.

    Так как в таком целом есть четыре бита, он может принимать одно из 16 значений; 16 – от двух до четвертой, или 2 раза 2 раза 2 раза 2. Каковы эти значения? Ответ зависит от того, является ли это целое число signed int или unsigned int . С unsigned int значение никогда не будет отрицательным; нет знака, связанного со значением. Вот 16 возможных значений четырехбитового unsigned int :

     bits value 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 14 1111 15 

    … и вот 16 возможных значений четырехбитового signed int :

     bits value 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 -8 1001 -7 1010 -6 1011 -5 1100 -4 1101 -3 1110 -2 1111 -1 

    Как вы можете видеть, для signed int s самый старший бит равен 1 если и только если число отрицательно. Вот почему для signed int s этот бит известен как «знаковый бит».

    Иногда мы заранее знаем, что значение, хранящееся в заданной целочисленной переменной, всегда будет положительным – когда оно используется, например, только для подсчета. В таком случае мы можем объявить переменную неподписанной, как, например, unsigned int num student; , При таком объявлении диапазон допустимых целочисленных значений (для 32-разрядного компилятора) будет смещаться от диапазона от -2147483648 до +2147483647 до диапазона от 0 до 4294967295. Таким образом, объявление целого числа без знака почти удваивает размер максимально возможного значение, которое оно может в противном случае удерживать.

    int и unsigned int представляют собой два разных целочисленных типа. ( int также может упоминаться как signed int или только что signed ; unsigned int также может упоминаться как unsigned .)

    Как следует из названий, int – это целочисленный тип со unsigned int , а unsigned int – целочисленный тип без знака . Это означает, что int может представлять отрицательные значения, а unsigned int может представлять только неотрицательные значения.

    Язык C задает некоторые требования к диапазонам этих типов. Диапазон int должен быть не менее -32767 .. +32767 , а диапазон unsigned int должен быть не менее 0 .. 65535 . Это означает, что оба типа должны быть не менее 16 бит. Они 32 бита на многих системах или даже 64 бита на некоторых. int обычно имеет дополнительное отрицательное значение из-за представления с двумя дополнениями, используемого большинством современных систем.

    Возможно, самым важным отличием является поведение подписанной или беззнаковой арифметики. Для подписанного int переполнение имеет неопределенное поведение. Для unsigned int нет переполнения; любая операция, которая дает значение за пределами диапазона типа, обертывается вокруг, например, UINT_MAX + 1 == 0 .

    Любой целочисленный тип, подписанный или неподписанный, моделирует поддиапазон бесконечного множества математических целых чисел. Пока вы работаете со значениями в пределах диапазона типа, все работает. Когда вы приближаетесь к нижней или верхней границе типа, вы сталкиваетесь с разрывом, и вы можете получить неожиданные результаты. Для знаковых целых типов проблемы возникают только для очень больших отрицательных и положительных значений, превышающих INT_MIN и INT_MAX . Для неподписанных целых типов проблемы возникают при очень больших положительных значениях и в нуле . Это может быть источником ошибок. Например, это бесконечный цикл:

     for (unsigned int i = 10; i >= 0; i --) [ printf("%u\n", i); } 

    потому что i всегда больше или равно нулю; это характер неподписанных типов. (Внутри цикла, когда i равно нулю, i – устанавливает его значение в UINT_MAX .)

    В терминах простых людей unsigned int является целым числом, которое не может быть отрицательным и, следовательно, имеет более высокий диапазон положительных значений, которые он может принять. Подписанный int является целым числом, которое может быть отрицательным, но имеет более низкий положительный диапазон в обмен на более отрицательные значения, которые он может принять.

    Давайте будем гением компьютера.