В чем разница между знаковыми и беззнаковыми переменными? - PullRequest
59 голосов
/ 07 марта 2009

Я видел их в контексте C и C ++, но в чем разница между знаковыми и беззнаковыми переменными?

Ответы [ 8 ]

117 голосов
/ 07 марта 2009

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

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

Переменные без знака и со знаком одного типа (например, int и byte) имеют одинаковый диапазон (диапазон 65 536 и 256 чисел соответственно), но без знака может представлять большее число, чем соответствующая переменная со знаком .

Например, unsigned byte может представлять значения от 0 до 255, тогда как signed byte может представлять -128 до 127.

Страница Wikipedia на Представления чисел со знаком объясняет разницу в представлении на уровне битов, а страница Integer (информатика) предоставляет таблицу диапазонов для каждого знака / неподписанного целочисленный тип.

41 голосов
/ 11 октября 2010

Хотя обычно упоминается как «знаковый бит», двоичные значения, которые мы обычно используем, не имеют истинного знакового бита.

Большинство компьютеров используют арифметику с двумя дополнениями. Отрицательные числа создаются путем взятия одного дополнения (перевернуть все биты) и добавления одного:

5 (decimal) -> 00000101 (binary)
1's complement: 11111010
add 1: 11111011 which is 'FB' in hex


Вот почему байт со знаком содержит значения от -128 до +127 вместо от -127 до +127:

1 0 0 0 0 0 0 0 = -128
1 0 0 0 0 0 0 1 = -127
- - -
1 1 1 1 1 1 1 0 = -2
1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 1 0 = 2
- - -
0 1 1 1 1 1 1 0 = 126
0 1 1 1 1 1 1 1 = 127
(добавить от 1 до 127 дает:)
1 0 0 0 0 0 0 0, который мы видим в верхней части этого графика, равен -128.


Если бы у нас был правильный бит знака, диапазон значений был бы таким же (например, от -127 до +127), потому что один знак зарезервирован для знака. Если старший значащий бит является знаковым битом, мы получили бы:

5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)

Интересно, что в этом случае у нас есть и ноль, и отрицательный ноль:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)


У нас нет -0 с двумя дополнительными; то, что было бы -0, равно -128 (или, если быть более общим, на одно большее, чем наибольшее положительное значение). Мы делаем со своим дополнением, хотя; все 1 бит отрицательны 0.

Математически, -0 равно 0. Я смутно помню компьютер, где -0 <0, но сейчас я не могу найти на него никаких ссылок. </p>

18 голосов
/ 07 марта 2009

Переменные со знаком используют один бит, чтобы указать, являются ли они положительными или отрицательными. Беззнаковые переменные не имеют этого бита, поэтому они могут хранить большие числа в одном и том же пространстве, но только неотрицательные числа, например 0 и выше.

Подробнее: Целые числа без знака и со знаком

3 голосов
/ 07 марта 2009

Переменные со знаком могут быть 0, положительными или отрицательными.

Переменные без знака могут быть 0 или положительными.

Иногда используются беззнаковые переменные, поскольку для представления фактического значения можно использовать больше битов. Давать вам больший ассортимент. Также вы можете убедиться, что отрицательное значение не будет передано вашей функции, например.

3 голосов
/ 07 марта 2009

Переменные без знака могут быть только положительными числами, потому что у них нет возможности указать, что они отрицательны.

Эта способность называется «знак» или «бит подписи».

Побочным эффектом является то, что без бита подписи у них есть еще один бит, который можно использовать для представления числа, удваивая максимальное число, которое он может представлять.

2 голосов
/ 15 июля 2010

unsigned используется, когда значение ur должно быть положительным, здесь нет отрицательного значения, если подписано для диапазона от -32768 до +32767 если без знака для диапазона от 0 до 65535

0 голосов
/ 22 июня 2016

Возможно, это не точное определение, но я приведу вам пример: Если вам нужно было создать случайное число, взяв его из системного времени, то здесь использование переменной без знака выгодно, поскольку существует большой диапазон для случайных чисел, поскольку числа со знаком дают как положительные, так и отрицательные числа. Поскольку системное время не может быть отрицательным, мы используем переменные без знака (только положительные числа), и у нас есть более широкий диапазон случайных чисел.

0 голосов
/ 07 марта 2009

Переменные без знака - это переменные, которые представлены внутри без математического знака (плюс или минус) может хранить только «ноль» или положительные значения . Допустим, переменная без знака имеет размер n бит , тогда она может представлять 2 ^ n (2 степени n) значения - от 0 до (2 ^ n -1). Переменная со знаком, с другой стороны, «теряет» один бит для представления знака, поэтому она может хранить значения от - (2 ^ (n-1) -1) до (2 ^ (n-1)), включая ноль. Таким образом, переменная со знаком может хранить положительных значений, отрицательных значений и ноль .

P.S:.
Внутри математический знак может быть представлен в форме дополнения, в форме дополнения до двух или со знаком (например: 0 -> +, 1-> -)
Все эти методы эффективно делят диапазон представимых значений в n битах (2 ^ n) на три части: положительную, отрицательную и нулевую.

Это всего лишь мои два цента.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...