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

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

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

4b9b3361

Ответ 1

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

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

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

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

Страница Wikipedia на Обозначенные числа объясняет разницу в представлении на уровне бит и Целочисленная (компьютерная наука) содержит таблицу диапазонов для каждого целочисленного типа с подписью/без знака.

Ответ 2

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

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

      5 (decimal) -> 00000101 (binary)
      1 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

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

Подробнее: Неподписанные и подписанные целые числа

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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