2012-06-27 4 views
1

Просто хотел узнать что-то о подписанной и неподписанной интерпретации. Правильно ли, если я скажу, что если число - это целые числа без знака, то это значение вычисляется нормально, преобразовывая двоичный код в десятичный ... но когда дело доходит до целых чисел со знаком, сначала записывается знаковый бит (msb), а затем вычисляется двоичное значение с использованием дополнения 2; вычисленное значение представляет собой реальное значение с отмеченным знаком.подписан vs неподписанная интерпретация

Я прав или чего-то не хватает?

+0

действительно ли подписанное дело, которое я спросил, относится только к подписанным отрицательным числам? – user1466594

+0

В случае преобразования в «десятичное с дополнительным знаковым префиксом» да, это работает именно так. Знак рассматривается отдельно, и абсолютное значение (которое в этом контексте * делает * существует для int.minvalue, потому что оно без знака) преобразуется в десятичное. – harold

+0

спасибо большое @harold :) – user1466594

ответ

1

Да, вы правы. При преобразовании целочисленного знака , представленного в 2 дополняет форму цифрой десятичной цифрой номер, вот как вы это сделаете. И 2 дополняет, как процессоры Intel хранят и выполняют математику со знаками целых чисел.

ПРИМЕЧАНИЕ. Но этот ответ не о том, как машины Intel представляют собой целые числа со знаком. Это общее.

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

Аппаратный дизайнер может выбрать для хранения подписанного номера как:

  1. Sign-Магнитуда (1 бит определяет знак, другие указать величину, не комплемента)
  2. 1 в дополнении (где, 8 -битовый 11111111 представляет -0 и 00000000 в +0)
  3. 2 в дополнение (популярный в общей аппаратной цели, как Intel)
  4. ... (есть и другие способы тоже. подробнее в Wikipedia article)

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

например. Если вы разрабатываете аппаратное обеспечение, которое в основном выполняет умножения, то хранение знаковых целых чисел в форме знаковой величины имеет смысл. Вы просто умножаете знаки и величины отдельно. С другой стороны, номера дополнений 2: a little unwieldy to multiply, but not much.

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

+0

Спасибо @ArjunShankar – user1466594

+1

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

+1

@harold. Мое намерение состояло в том, чтобы дать простое объяснение, сохранив при этом, что существуют разные представления. Одним из способов умножения дополнения 2 является «Модифицированный множитель Боуга-Вули». Недавно я построил один из них в качестве замены замены мультипликатора с одним циклом LEON3 :) – ArjunShankar

0

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

Однако это не единственный способ. Вы можете преобразовать отрицательное 3-битное значение 111 в дополнение к «7», а затем вычесть «8» из него и достигнуть «-1».

+0

Спасибо @alex :) – user1466594

+3

Не забудьте оставить ответы и принять полезные ответы. –