Числа в регистрах в двоичном виде .Вот почему 32-битный регистр может хранить значения со знаком -2^31 .. 2^31-1
, используя кодировку дополнения 2.https://en.wikipedia.org/wiki/Two%27s_complement
Если собственный формат хранения в регистре был десятичным, сдвиги влево и вправо будут умножаться / делиться на степени 10, а не на степени 2.
Кодированиеотделен от стоимости.При заданном битовом массиве 0b11111111111111111111110000011001
в 32-битном регистре вы можете описать / представить закодированное значение как
-999
десятичное, интерпретируя его как дополнение со знаком 2 0xfffffc19
шестнадцатеричный беззнаковый 037777776031
восьмеричный 0b11111111111111111111110000011001
двоичный
Это все одно и то же число, просто разные способы выражения либо математическогозначение (как отрицательное десятичное число), или битовый шаблон дополнения 2 (шестнадцатеричный, восьмеричный и двоичный).
Обычно шестнадцатеричный используется только для описания битового шаблона, поэтому вы обычно не видитеотрицательное шестнадцатеричное число, например -0x3e7
.
Это распространенное заблуждение, что числа в регистрах или в памяти «в шестнадцатеричном формате».Шестнадцатеричный формат - это формат сериализации для двоичных чисел, позволяющий хранить их в виде текста в удобочитаемом формате.Число только в шестнадцатеричном виде, если оно хранится в виде последовательности символов ASCII.
Строка десятичных цифр ASCII - это еще один способ сериализации чисел, и это то, что вас просят сделать здесь.
Шестнадцатеричные и десятичные обычно используются в исходном коде asm, но ассемблер соберет ваши числа в 32-битные двоичные слова.(Или 16-битный непосредственно как часть потока команд, для чего-то вроде addiu $t0, $t1, 0x1234
)
Вы можете говорить о значении двоичного числа, используя шестнадцатеричный код, но на самом деле оно хранится как базовые 2 бита.