Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是";假减法;在现实世界中使用过吗?_C - Fatal编程技术网

C 是";假减法;在现实世界中使用过吗?

C 是";假减法;在现实世界中使用过吗?,c,C,我参加了一门计算机系统课程,作为我硕士学位的预科课程,我发现了一些有趣的、难以实际应用的东西,那就是“假装减法”,事实上不需要减法指令 比如: x-y 可以写为: x+(~y+1) 现在,这一切都很好,但对于一个简单的减法来说似乎太复杂了,特别是当你可以很容易地把“x-y”放进去的时候。在某些情况下,是否有必要这样做,或者只是一些可以做但不能做的事情。我看不出这样做的意义。它不再有效了。事实上,如果编译器没有对其进行优化,它最终会生成更多的操作码。这通常是在硬件级别(即ALU内部)完成的 在软件

我参加了一门计算机系统课程,作为我硕士学位的预科课程,我发现了一些有趣的、难以实际应用的东西,那就是“假装减法”,事实上不需要减法指令

比如:

x-y

可以写为:

x+(~y+1)


现在,这一切都很好,但对于一个简单的减法来说似乎太复杂了,特别是当你可以很容易地把“x-y”放进去的时候。在某些情况下,是否有必要这样做,或者只是一些可以做但不能做的事情。

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

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


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

应该很明显,减法是如何在内部完成的,所以我不确定你所说的“在现实世界中使用”是什么意思。这就是为什么首先选择2的补码,因为减法只是溢出负加法。

我看不出有任何理由在您的C代码中这样做。在软件中做这件事并不比使用减号运算符进行减法快,而且更不清楚

然而,这是处理器执行减法的方式。我打赌您已经将此代码视为硬件功能的示例,因为更容易看到
x+(~y+1)
将如何成为逻辑电路


所以。。。不,您不会在现实世界中使用此代码,但此操作会在处理器中执行很多次。

两者的互补实现是在硬件中完成的,因此您不需要像内置数据类型那样实现它们


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

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


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

看起来像2的补码数学。它通常是在这样的硬件中实现的。我不确定,但我认为它是在一些二进制搜索实现中使用的。它取消了2^31的限制。你可以在谷歌上搜索“二进制搜索中断”并找到这个例子。这是一个有50多种计算方法的页面mid=(高+低)/2@Behrooz:解决方案是执行
low+(high-low)/2
。编译器推断这是一条加法指令,但CPU将执行
x+(~y+1)
。这就是加法在硬件中的实现方式。是的,我想加强它。通常情况下,分区不是这样实现的!我的意思是,以这种方式编写代码而不是仅仅使用简单的“-”对我有什么好处吗?@Jetti,没有。然而,你的问题实际上是
“伪减法”在现实世界中使用过吗?
,答案是响亮的“是”。感谢您对它可能使用的时间的解释。事实上,我曾经在一个示例n位有符号整数算术库中实现过此方法,它很容易实现。@phoxis-有趣!你能告诉我这个库有什么用途吗?大整数计算,它的大小比内置数据类型要大。例如,您可以定义一个256位长的整数,32字节长的整数(8位字节),并表示一些巨大的数字。我现在不是在做什么严肃的事情,但可能这些可以用于大整数计算,比如用加密算法计算大素数,我想(?)啊,好的。感谢您的回答,并了解它的用途。