Добавление двух 8-битных двоичных чисел, дополняющих два - PullRequest
0 голосов
/ 22 августа 2011

Каков результат (в 8-разрядном двоичном коде) сложения двух 8-разрядных чисел с двумя дополнительными числами 10111011 и 11010101 и как бы вы рассчитали это?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

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

              [ hex,unsigned,signed]
     10111011 [0xBB,     187,   -69]
+    11010101 [0xD5,     213,   -43]
     --------
= (1)10010000 [0x90,     144,  -112]

Вы можете выполнить этот процесс вручную следующим образом:

set carry to zero
for each position starting at right side, progressing left:
    set sum to carry
    add bit from position in first number to sum
    add bit from position in second number to sum
    if sum is greater than one:
        subtract two from sum
        set carry to one
    else
        set carry to zero
    end if
    store sum to position of result
end for
0 голосов
/ 22 августа 2011

Приятно то, что в дополнении к двум вам не нужно знать, есть ли у вас номера со знаком или без знака. Просто возьмите двоичное представление, добавьте и отбросьте бит переполнения. Если вы оставили диапазон представимых чисел, ну, вам не повезло. Но добавление двух отрицательных чисел и получение положительного должно вызвать подозрение.

На практическом замечании: не пытайтесь защититься от переполнения в C, задавая такие вещи, как

a = b+c;
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) {
  ...
}

Это, вероятно, будет работать в стандартных сборках отладки, но компиляторы C (и C ++) могут оптимизировать эту проверку. (Это чаще всего наблюдается для арифметики без знака, if (a >= (a+b)) { ... } и gcc -Wall предупреждают, что он знает, что это ложно. Это нормально, поскольку стандарт C говорит, что переполнение в любом случае неопределенное поведение.)

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

...