int a = 34;
int b = 50;
Вы можете преобразовать b в отрицательное значение, используя отрицание и добавив 1:
int c = a + (~b + 1);
printf("%d\n", c);
-16
Это отрицание знака дополнения до двух. Процессор делает это, когда вы используете оператор «-», когда хотите отменить значение или вычесть его.
Конвертировать поплавок проще. Просто отрицать первый бит (шош привел тебе пример, как это сделать).
EDIT:
Хорошо, ребята. Я сдаюсь. Вот моя независимая от компилятора версия:
#include <stdio.h>
unsigned int adder(unsigned int a, unsigned int b) {
unsigned int loop = 1;
unsigned int sum = 0;
unsigned int ai, bi, ci;
while (loop) {
ai = a & loop;
bi = b & loop;
ci = sum & loop;
sum = sum ^ ai ^ bi; // add i-th bit of a and b, and add carry bit stored in sum i-th bit
loop = loop << 1;
if ((ai&bi)|(ci&ai)|(ci&bi)) sum = sum^loop; // add carry bit
}
return sum;
}
unsigned int sub(unsigned int a, unsigned int b) {
return adder(a, adder(~b, 1)); // add negation + 1 (two's complement here)
}
int main() {
unsigned int a = 35;
unsigned int b = 40;
printf("%u - %u = %d\n", a, b, sub(a, b)); // printf function isn't compiler independent here
return 0;
}
Я использую unsigned int, чтобы любой компилятор относился к нему одинаково.
Если вы хотите вычесть отрицательные значения, сделайте это так:
unsgined int negative15 = adder(~15, 1);
Теперь мы полностью независимы от соглашений о подписанных значениях. В моем подходе результат все целые будут храниться как два дополнения - так что вы должны быть осторожны с большими (они должны начинаться с 0 бит).