在没有-
运算符的情况下,如何在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位开始)。