在现实世界中曾经使用过“伪造的减法”吗?

时间:2011-06-16 15:25:24

标签: c

我正在参加一个计算机系统课程作为我的硕士课程的预先要求,并且遇到了一些令我着迷且难以看到实际用途的东西,那就是“伪造减法”以及不需要的事实是一个减法指令。

类似的东西:

x - y

可以写成:

x +(~y + 1)

现在,这一切都很好,但似乎对于简单的减法而言过于复杂,尤其是当您可以轻松地放入“x - y”时。是否有必要这样做的情况,或者只是可以做但不是的事情。

6 个答案:

答案 0 :(得分:6)

这通常是在硬件级别(即在ALU内部)完成的。

在软件层面,它通常是无用的,因为它永远不会比直接减法更有效(除非你有一个真正奇怪的编译器/平台组合)。

答案 1 :(得分:2)

显而易见,那就是内部完成减法 ,所以我不确定“在现实世界中使用”是什么意思。这就是为什么首先选择了两个补码的原因,因为减法只是溢出负增加。

答案 2 :(得分:2)

这两个补码的实现是在硬件中完成的,所以你不需要像内置数据类型那样实现它们。

如果你要制作一个n位整数算术库,那么你需要模拟整数加法,减法,乘法和除法等操作,在这种情况下可以实现这样一种技术来添加n位长度数,但在我看来,使用进位标志是更好的实现。

答案 3 :(得分:1)

我认为没有理由在您的C代码中执行此操作。在软件中进行操作并不比使用减号运算符减去更快 - 并且更加不清楚。

但是,这就是处理器执行减法的方式。我敢打赌你已经看到这段代码作为硬件的一个例子,因为它更容易看出x + (~y + 1)将如何成为一个逻辑电路。

所以......不,你不会在现实世界中使用这个代码,但是这个操作在处理器中执行了很多次。

答案 4 :(得分:0)

我看不出这样做的意义。它不再有效率。事实上,如果它没有被编译器优化,它最终会产生更多的操作码。

答案 5 :(得分:0)

像这样的东西在CPU有数十亿个晶体管玩之前更常见。特定的CPU可能没有实现特定的减法操作码,因此针对它的编译器(或汇编程序)必须知道该技巧。

这些操作还可以帮助您了解CPU的内部实现。例如,CPU的除法运算有时通过取除数的倒数并乘以除数来完成;倒数是唯一正在执行的“分裂”。