我正在参加一个计算机系统课程作为我的硕士课程的预先要求,并且遇到了一些令我着迷且难以看到实际用途的东西,那就是“伪造减法”以及不需要的事实是一个减法指令。
类似的东西:
x - y
可以写成:
x +(~y + 1)
现在,这一切都很好,但似乎对于简单的减法而言过于复杂,尤其是当您可以轻松地放入“x - y”时。是否有必要这样做的情况,或者只是可以做但不是的事情。
答案 0 :(得分:6)
这通常是在硬件级别(即在ALU内部)完成的。
在软件层面,它通常是无用的,因为它永远不会比直接减法更有效(除非你有一个真正奇怪的编译器/平台组合)。
答案 1 :(得分:2)
显而易见,那就是内部完成减法 ,所以我不确定“在现实世界中使用”是什么意思。这就是为什么首先选择了两个补码的原因,因为减法只是溢出负增加。
答案 2 :(得分:2)
这两个补码的实现是在硬件中完成的,所以你不需要像内置数据类型那样实现它们。
如果你要制作一个n位整数算术库,那么你需要模拟整数加法,减法,乘法和除法等操作,在这种情况下可以实现这样一种技术来添加n位长度数,但在我看来,使用进位标志是更好的实现。
答案 3 :(得分:1)
我认为没有理由在您的C代码中执行此操作。在软件中进行操作并不比使用减号运算符减去更快 - 并且更加不清楚。
但是,这就是处理器执行减法的方式。我敢打赌你已经看到这段代码作为硬件的一个例子,因为它更容易看出x + (~y + 1)
将如何成为一个逻辑电路。
所以......不,你不会在现实世界中使用这个代码,但是这个操作在处理器中执行了很多次。
答案 4 :(得分:0)
我看不出这样做的意义。它不再有效率。事实上,如果它没有被编译器优化,它最终会产生更多的操作码。
答案 5 :(得分:0)
这些操作还可以帮助您了解CPU的内部实现。例如,CPU的除法运算有时通过取除数的倒数并乘以除数来完成;倒数是唯一正在执行的“分裂”。