Обратите внимание, что это будет для сумматора, известного как сумматор с пульсациями , который работает, но не работает оптимально. Большинство двоичных сумматоров, встроенных в аппаратные средства, представляют собой быструю сумматорную форму, такую как сумматор с упреждением .
Мой сумматор ripple-carry работает как для целых чисел без знака, так и для целых чисел дополнения 2, если вы установили для значение carry_in значение 0, и для целых чисел дополнения 1, если для значения carry_in установлено значение 1. Я также добавил флаги, чтобы показать недополнение или переполнение при добавлении.
#define BIT_LEN 32
#define ADD_OK 0
#define ADD_UNDERFLOW 1
#define ADD_OVERFLOW 2
int ripple_add(int a, int b, char carry_in, char* flags) {
int result = 0;
int current_bit_position = 0;
char a_bit = 0, b_bit = 0, result_bit = 0;
while ((a || b) && current_bit_position < BIT_LEN) {
a_bit = a & 1;
b_bit = b & 1;
result_bit = (a_bit ^ b_bit ^ carry_in);
result |= result_bit << current_bit_position++;
carry_in = (a_bit & b_bit) | (a_bit & carry_in) | (b_bit & carry_in);
a >>= 1;
b >>= 1;
}
if (current_bit_position < BIT_LEN) {
*flags = ADD_OK;
}
else if (a_bit & b_bit & ~result_bit) {
*flags = ADD_UNDERFLOW;
}
else if (~a_bit & ~b_bit & result_bit) {
*flags = ADD_OVERFLOW;
}
else {
*flags = ADD_OK;
}
return result;
}