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


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

8 55

8 ответов:

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

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

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

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

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

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

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

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 и выше.

дополнительные: целые числа без знака и знака

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

эта способность называется "знак" или "подписывающий бит".

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

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

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

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

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

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

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

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

Я надеюсь, что это помогает.

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