没有减号的减法

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

 int a = 34; int b = 50; 

您可以使用否定并添加1将b转换为负值:

 int c = a + (~b + 1); printf("%d\n", c); -16 

这是两个补码的否定。 处理器正在使用’ – ‘运算符时,如果要取消值或将其删除。

转换浮点数更简单。 只是否定第一位(shoosh给你的例子如何做到这一点)。

编辑:

好,朋友们。 我放弃。 这是我的编译器独立版本:

 #include  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位开始)。

Pontus是对的,C标准没有规定2的补充(即使它是事实上的硬件标准)。 为Phil的创意答案+1; 这是另一种在不使用标准库或 – 运算符的情况下获得-1的方法。

C强制执行三种可能的表示,因此您可以嗅探正在运行的表示并为每个表示获得不同的-1:

 negation= ~1; if (negation+1==0) /* one's complement arithmetic */ minusone= ~1; else if (negation+2==0) /* two's complement arithmetic */ minusone= ~0; else /* sign-and-magnitude arithmetic */ minusone= ~0x7FFFFFFE; r= a+b*minusone; 

值0x7FFFFFFFE将取决于您感兴趣的整数类型的宽度(’值位数’); 如果没有说明,你还有更多工作要找到它!

  • +没有位设置
  • +语言独立
  • +可以针对不同的数字类型进行调整(int,float等)
  • – 几乎肯定不是你的C作业答案(可能是关于比特)

展开ab:

 ab = a +( -  b)
     = a +( -  1).b

制造-1:

 float:pi = asin(1.0);
 (用minusone_flt = sin(3.0 / 2.0 * pi);
 math.h)或= cos(pi)
                  或= log10(0.1)
复数:minusone_cpx =(0,1)** 2;  //我平方
整数:minusone_int = 0;  minusone_int--;  //或转换上面的一个浮点数

鉴于在C中没有强制要求支持二进制补码的编码整数,所以迭代直到完成。 如果他们想让你跳过燃烧的篮球,就不需要高效率了!

 int subtract(int a, int b) { if ( b < 0 ) return a+abs(b); while (b-- > 0) --a; return a; } 

愚蠢的问题……可能是傻逼的!

如果你想为浮点数做,从正数开始并改变它的符号位,如下所示:

 float f = 3; *(int*)&f |= 0x80000000; // now f is -3. float m = 4 + f; // m = 1 

您也可以使用适当的64位整数对双精度执行此操作。 在visual studio中,这是__int64。

  • +没有位设置
  • +语言独立
  • +独立于数字类型(int,float等)
  • 需要a> b (即阳性结果)
  • – 几乎肯定不是你的C作业答案(可能是关于比特)
  •   a  -  b = c 

    将自己限制在数字空间0 <= c <(a + b):

            (a  -  b)mod(a + b)= c mod(a + b)
     a mod(a + b) -  b mod(a + b)= c mod(a + b)
    

    简化第二学期:

     (-b).mod(a + b)=(a + bb).mod(a + b)
                   = a.mod(a + b)
    

    代:

     a.mod(a + b)+ a.mod(a + b)= c.mod(a + b)
     2 a.mod(a + b)= c.mod(a + b)
    

    如果b> a,那么ba> 0,所以:

     c.mod(a + b)= c
     c = 2 a.mod(a + b)
    

    因此,如果a总是大于b,那么这将起作用。

    看看这里: 使用按位运算符添加/减去

    我想这个

    b – a =〜(a + ~b)

    assembly(累加器)样式:

     int result = a; result -= b; 

    要在C中减去两个整数,您只需要:

     int subtract(int a, int b) { return a + (~b) + 1; } 

    我不相信有一个简单的优雅解决方案浮动或双数字,如整数。 因此,您可以在数组中转换浮点数并应用与此处模拟的算法类似的算法

    由于问题要求整数而不是int ,你可以实现一个小的解释器,而不是使用教会数字 。

    为每个可能的int-int情况创建一个查找表!

    未经测试。 不使用2的补码:

     #include  #include  int sillyNegate(int x) { if (x <= 0) return abs(x); else { // setlocale(LC_ALL, "C"); // if necessary. char buffer[256]; snprintf(buffer, 255, "%c%d", 0x2d, x); sscanf(buffer, "%d", &x); return x; } } 

    假设int的长度远小于255,并且snprintf / sscanf往返不会产生任何未指定的行为(对吗?对吗?)。

    可以使用a - b == a + (-b).计算减法a - b == a + (-b).


    替代方案:

     #include  int moreSillyNegate(int x) { return x * ilogb(0.5); // ilogb(0.5) == -1; } 

    这将使用整数溢出:

     #include int subtractWithoutMinusSign(int a, int b){ return a + (b * (INT_MAX + INT_MAX + 1)); } 

    这也适用于花车(假设您制作浮动版……)

    对于任何数据类型的最大范围,一个补码提供的负值减少1到任何相应的值。 例如:
    ~1 ——–> -2
    ~2 ———> -3
    等等……我会用一些代码片段向你展示这个观察结果

     #include int main() { int a , b; a=10; b=~a; // b-----> -11 printf("%d\n",a+~b+1);// equivalent to ab return 0; } 

    输出:0
    注意:这仅适用于数据类型范围。 对于int数据类型的意思,此规则仅适用于范围[-2,147,483,648到2,147,483,647]的值。 谢谢…..这可以帮到你

      int num1, num2, count = 0; Console.WriteLine("Enter two numebrs"); num1 = int.Parse(Console.ReadLine()); num2 = int.Parse(Console.ReadLine()); if (num1 < num2) { num1 = num1 + num2; num2 = num1 - num2; num1 = num1 - num2; } for (; num2 < num1; num2++) { count++; } Console.WriteLine("The diferrence is " + count); 
     void main() { int a=5; int b=7; while(b--)a--; printf("sud=%d",a); }