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

StackOverflow https://stackoverflow.com/questions/621290

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

      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, положительными или отрицательными.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top