Как я могу хранить числа> 128 в однобайтовом интергере со знаком? - PullRequest
2 голосов
/ 11 октября 2010

Я читаю книгу Искусство ассемблера Язык .Там я наткнулся на этот абзац.

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

  1. Инвертируйте все биты в числе, т. Е. Примените логическую функцию NOT.

  2. Добавьте единицу к инвертированному результату.

    Например, для вычисления восьмибитного эквивалента -5:

    0000 0101  Five (in binary)   
    1111 1010  Invert all the bits.   
    1111 1011  Add one to obtain result.
    

Здесь я хочу знать, если 0000 0101 равно 5 в десятичных числах, а 1111 1011 равно -5, то как мы представим 251?Разве это не то же самое 1111 1011?Как компьютер различает -5 и 251?

Ответы [ 2 ]

4 голосов
/ 11 октября 2010

Когда вы представляете числа со знаком в 8 битах, 8-й бит (бит HO) является битом знака.Поэтому вы можете использовать только 7 бит для хранения значения числа.Диапазон для числа со знаком в 8 битах составляет -128..127.251 нельзя представить, если вы не используете более 8 бит.

2 голосов
/ 11 октября 2010

Компьютер не делает различий между ними - вы должны использовать соответствующие инструкции.

Например, на x86 вы используете JA (переход, если выше) и JB (переход, если ниже) для чисел без знака, JG (переход, если больше) и JL (переход, если меньше, чем ) для подписанных номеров. Аналогично вы используете IMUL и IDIV для умножения / деления чисел со знаком и MUL и DIV для чисел без знака.

...