Показаны сообщения с ярлыком math. Показать все сообщения
Показаны сообщения с ярлыком math. Показать все сообщения

вторник, 10 марта 2009 г.

Представление отрицательных чисел в дополнительном коде

Во всех примерах будут использоваться 8-разрядные числа.

Чтобы получить представление отрицательного числа в дополнительном коде, надо:

  1. Взять представление этого числа со знаком +
  2. Инвертировать все цифровые разряды
  3. Прибавить 1 в младший разряд

Пример: найдем представление числа -108 в дополнительном коде.

1. Запишем число 108 в двоичном представлении:

01101100

2. Инвертируем все разряды:

10010011

3. Прибавляем 1 в младший разряд:

 10010011
+00000001
---------
 10010100

Число -108 в дополнительном коде будет выглядеть так: 10010100

Правило перевода можно упростить:

  1. Взять представление числа со знаком +
  2. Инвертировать все цифровые разряды до младшей единицы. Младшая единица и следующие за ней нули остаются неизменными

В самом деле, это легко заметить, если рассмотреть представления чисел 108 и -108:

 108 = 01101100ДК
-108 = 10010100ДК

Некоторые 8-битные числа в дополнительном коде:

Число ДК
-128 1000 0000
-127 1000 0001
-126 1000 0010
-125 1000 0011
... ...
-3 1111 1101
-2 1111 1110
-1 1111 1111
0 0000 0000
1 0000 0001
2 0000 0010
3 0000 0011
... ...
125 0111 1101
126 0111 1110
127 0111 1111

суббота, 7 марта 2009 г.

x86: idiv, sar

Целые числа можно легко делить на степени двойки используя команду sar. Однако команда sar может дать результат отличный от полученного с помощью команды idiv.

idiv округляет результат в сторону нуля. Знак остатка всегда равен знаку делимого.

17 idiv (-8) = -2 (1 в остатке)
17 = (-8) * (-2) + 1

-17 idiv 8 = -2 (-1 в остатке)
-17 = 8 * (-2) + (-1)

В вычислениях с sar, результат округляется в меньшую сторону (в сторону минус бесконечности)

-17 sar 3 = -3