在没有-运算符的情况下,如何在C中减去两个整数?

最佳答案

int a = 34;
int b = 50;

您可以使用负数并添加1来将b转换为负值:
int c = a + (~b + 1);

printf("%d\n", c);

-16

这是二进制补码的取反。当您要否定值或对其进行子跟踪时,如果您使用“-”运算符,则处理器正在执行此操作。

转换浮点数更简单。只需否定第一位(shoosh给您示例了如何执行此操作)。

编辑:

好, friend 们。我放弃。这是我的独立于编译器的版本:
#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位开始)。

10-07 17:46