Отрицательные числа в сигнале слепого Шаума (RSA) [дубликат]

58
задан wattostudios 2 May 2012 в 07:52
поделиться

7 ответов

Ответ - дополнение двух .

Короче говоря, Java (и большинство современных языков) не представляют собой целые числа со знаком с объявлением с знаковой величиной. Другими словами, 8-разрядное целое число не является знаковым битом, за которым следует 7-разрядное целое число без знака.

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

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

Дополнение от 2 не является ужасно сложным, но получает первоначальное хорошее сцепление с тем, что является дополнением и как и почему он работает, вероятно, выходит за рамки SO-ответа. Начните с статьи в Википедии, или в google термин для получения дополнительных ресурсов.

Чтобы попытаться кратко рассмотреть ваш запрос о -128, основная идея создания двоичного номера второго заключается в том, чтобы принять неподписанную форму номера , инвертируйте все биты и добавьте один. Таким образом, unsigned 128 - 10000000. Перевернутый, это 01111111, и добавление снова получает 10000000. Таким образом, в системе дополнений двух, 10000000 недвусмысленно -128, а не +128. Числа, большие или равные +128, просто не могут быть представлены в 8 битах с использованием системы комплемента двух, потому что они будут неоднозначными с формами отрицательных чисел.

66
ответ дан Tyler McHenry 24 August 2018 в 22:59
поделиться

Дополнение 2 работает следующим образом:

Байт состоит из 8 бит.

00000000 означает 0

11111111 означает 255

Однако, если числа были представлены так, мы не могли бы различать, является ли число положительным или отрицательным. По этой причине бит с левой стороны дает нам эту информацию. Если бит с левой стороны 0, вы можете начать добавлять значение других бит в верхней части zero. Если бит 1, вы должны начать добавлять вверху -128. Поскольку бит на левой стороне равен двум параметрам в семь.

Примеры;

В этих примерах бит с левой стороны равен 1, это означает, что мы добавляем значения других бит в верхней части -128.

10000000 = -128 (-128 + 0)

10000001 = -127 (-128 + 1)

10000011 = -125 (-128 + 3)

10000111 = -121 (-128 + 7)

Одинаковые байты, но на этот раз бит слева - 0. Это означает, что мы начинаем добавлять вверху 0.

00000000 = 0 (0 + 0)

00000001 = 1 (0 + 1)

00000011 = 3 (0 + 3)

00000111 = 7 (0 + 7)

Если мы до сих пор в порядке, ответ на ваш вопрос, наименьшее возможное число с 8 бит с этим правилом:

10000000 = -128

наибольшее возможное число

011111111 = 127

Вот почему диапазон находится между -128 и 127.

8
ответ дан Ad Infinitum 24 August 2018 в 22:59
поделиться

в java все переменные, такие как byte short int long float double, записываются как подписанные. так что очень просто, бит главы всегда указывает, что (отрицательное или положительное), а потому, что числа делятся на 2 половины сдвинуты как отрицательные, 0 по умолчанию положительно. поэтому это выглядит так:

это положительно + | 0001001 1 | 0001001 это отрицательно - | 0001001 0 | 0001001 в качестве короткого байта отрицательный -000000011111111 0000000011111111

1
ответ дан Andrei Bazavan 24 August 2018 в 22:59
поделиться

Не попадая в два дополнения: 2 ^ 8 (так как байт имеет 8 цифр и может иметь 1 из 2 значений) = 256, поэтому самые индивидуальные значения, которые может представлять байт, составляют 256. Таким образом, представляя числа от -128 до -1 - половина нашего диапазона. Я считаю, что здесь вопрос заключается в том, почему максимальное положительное значение 127, а не 128. Это потому, что мы должны представлять число 0, поэтому включительно 0-127 - это другие 128 возможностей нашего диапазона.

Если мы допустили только положительные значения, такие как беззнаковый байт, где отрицательные числа невозможен, диапазон будет 0-255, так как это 256 различных значений (включая 0).

0
ответ дан David Hollowell - MSFT 24 August 2018 в 22:59
поделиться

байт состоит из 8 бит ---> 1 бит знака (положительный или отрицательный) 7-битное значение

, поэтому диапазон -2 ^ 7 отрицательный (-128) до 2 ^ 7 -1 положительный ( 127)

1
ответ дан Mina Fawzy 24 August 2018 в 22:59
поделиться

Базовые числовые типы могут представлять 2 ^ n чисел. Посмотрите на случай n = 2. Вы можете представить четыре случая, давайте назовем их a, b, c, d. Тогда вы можете согласиться либо на a=-2, b=-1, c=0, d=1 (это принято), либо a=-1, b=0, c=1, d=2 (возможно, но не используется). Итак, если у вас есть только один нуль и удерживайте 2 ^ n состояния, ваш abs(min) != max Увеличение n перемещает границы, но abs(min) != max все еще сохраняется.

3
ответ дан Sic 24 August 2018 в 22:59
поделиться

Как отметил Джеймс в своем комментарии, это потому, что так работает дополнение двух.

Если мы выразим другие слова, вы можете представить 2 ^ 8 = 256 видов значений. который в этом случае используется как 128 отрицательных чисел, 127 положительных чисел и нуль. Если мы использовали 7 бит для представления значения, +1 бит для знака, мы могли бы представить одно меньшее значение и также имели бы два нуля (что было бы очень неудачно, так как сравнение двух значений было бы более сложным из-за этого).

8
ответ дан Tamás Szelei 24 August 2018 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: