2009-03-07 2 views
48

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

+0

Я думал, что мы предполагаем, что в программировании по умолчанию, а не при маркировке не связанных с программированием? –

+0

Так и я. Я нашел довольно много перестановок при программировании. Интересно, почему? – batbrat

+0

Вопрос относится к конкретному аспекту программирования в целом. – Sam152

ответ

102

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

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

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

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

Страница Википедии на Signed number representations объясняет разницу в представлении на уровне бит, а на странице Integer (computer science) представлена ​​таблица диапазонов для каждого целочисленного типа с подписью/без знака.

+0

Положительные числа больше нуля. Подписанные номера, по крайней мере, на C, могут использовать знаковый бит, а не представление комплемента, поэтому не имеют того же диапазона, что и без знака, из-за повторного +/- ноль. Если вы говорите, что int - 16 бит, скажем, платформа; большинство современных систем - 32 или 64 бит. –

18

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

Для более: Unsigned and Signed Integers

+0

s/положительный/неотрицательный/ – Ken

+0

Yup, фиксированный, чтобы сделать более понятным. –

+0

спасибо, после 2 минут поиска в Google, это был мой любимый ответ, чтобы уточнить для меня – SheldonH

3

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

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

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

3

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

Неподписанные переменные могут быть 0 или положительными.

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

0

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

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

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

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

2

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

37

Хотя обычно не упоминается как " sign bit ', двоичные значения, которые мы обычно используем, не имеют истинного бита знака.

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

            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, но я не могу найти здесь никаких ссылок.

+3

Большое спасибо! Я был очень смущен, почему это -128 до 127 для подписанного байта, а не от -127 до 127. Этот ответ требует больше голосов! –

-1

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

Смежные вопросы