整数比较在内部如何工作?


18

例如,使用类C语言比较两个整数时,如下所示:

if (3 > 2) {
    // do something
}

在内部如何判断3是否大于2(真)?


19
目前的答案是确定的情况下,当比较-大约是可变的表达,但缺乏一个声明,许多现代编译器会看你的一段代码,检测到的表达永远是(因为文字)真实,只是忽略if共,直接进行编码do something
SJuan76 '17


3
@雪人,我不同意。任何“这是如何工作的”编程查询都可以归结为该问题,但这并不能使它们重复。
user1643723 '17

1
@ user1643723当所讨论的函数是特定的操作码时会执行此操作。
克莱里斯

1
@ user1643723问题是询问计算机如何执行基本操作,最重要的答案是讨论逻辑门和逻辑表。受骗对象的最佳答案中广泛涉及了两个主题,它们也回答了您的问题。

Answers:


61

一路下到兔子洞,是吗?好的,我会尝试的。

步骤1.从C到机器语言

C编译器将您的比较转换为以机器语言存储的操作码。机器语言是CPU解释为指令的一系列数字。在这种情况下,将有两个操作码:“减去进位”和“跳进进位”。换句话说,在一条指令中从3中减去2,然后下一条指令检查是否溢出。在这之前,将有两条指令将数字2和3加载到可以比较的位置。

MOV AX, 3    ; Store 3 in register AX
MOV BX, 2    ; Store 2 in register BX
SUB AX, BX   ; Subtract BX from AX
JC  Label    ; If the previous operation overflowed, continue processing at memory location "Label"

以上每个都有二进制表示;例如,用于该代码SUB2D十六进制或00101101二进制。

步骤2.对ALU的操作码

算术操作码喜欢ADDSUBMUL,和DIV执行使用基本整数运算ALU或算术逻辑单元内置于CPU。数字通过一些操作码存储在寄存器中。其他操作码则指示芯片调用ALU对当时存储在寄存器中的内容进行数学运算。

注意:在这一点上,如果使用C之类的3GL,我们已经超出了任何软件工程师可以担心的范围。

步骤3. ALU,半加法器和全加器

您知道吗,您知道的所有数学运算都可以简化为一系列NOR运算?这就是ALU的工作原理。

ALU只知道如何使用二进制数,并且只能执行逻辑运算,例如OR,NOT,AND和XOR。二进制加法和减法的实现是通过在称为加法器的子系统中以一定方式排列的一系列逻辑运算来完成的。这些子系统由“半加法器”网络组成,该网络对两位进行操作并确定其一位和和一位进位标志。通过将它们链接在一起,ALU可以对具有8、16、32等位的数字执行运算。

半加法器

减法呢?减法只是加法的另一种形式:

A - B = A + (-B)

ALU -B通过采用的二进制补码进行计算B。一旦将其转换为负值,将值提交给加法器将导致减法运算。

步骤4:最后一步:片上晶体管

加法器的操作是通过电子元件的组合来实现的,这些电子元件相互作用以创建“逻辑门”,例如在晶体管,晶体管或TTL或CMOS中发现的那些逻辑门。单击此处查看一些示例,以了解如何进行连接。

当然,在芯片上,这些“电路”以数百万个导电和非导电材料的细小片段实现,但原理与它们是面包板上的全尺寸组件一样。 观看此视频该视频通过电子显微镜的镜头向您展示微芯片上的所有晶体管。

一些附加说明:

  1. 您编写的代码实际上将由编译器预先计算,而不在运行时执行,因为它仅由常量组成。

  2. 一些编译器不编译为机器代码,而是引入了另一层,例如Java字节码或.NET中间语言。但是最后,所有这些都通过机器语言执行。

  3. 某些数学运算实际上并未计算出来;在算术协处理单元上的大量表中查找它们,或者包含查找和计算或插值的组合。一个例子是计算平方根的函数。每个现代PC CPU都在每个CPU内核中内置了一个浮点协处理单元。


3
FWIW,提及TTL可能会造成混乱,因为实际上没有现代处理器使用TTL信号,大多数处理器使用CMOS FET和较低电压而不是5v BJT。
whatsisname

2
正如@whatsisname所暗示的那样,CMOS绝对比TTL更好,因为它不仅比现代处理器更精确,而且从概念上讲也更简单。
Jules

3
这就是@JackAidley的含义:“换句话说,在一条指令中3减去2,然后下一条指令检查是否溢出。”
KutuluMike

1
细说:我想CMP是不会用,SUB但那还是或多或少的是“ SUB当结果被忽略并且只设置标志时”
Hagen von Eitzen

5
您对半加法器和全加器的定义不正确。半加法器接受两个1位输入,并返回总和并进位。一个全加法器需要一个附加的进位输入,但仍然只有一位。创建N位加法器的方法有很多,最简单的方法是纹波加法器,它只是N个全加法器的链。在实践中,对于较大的Ns,延迟会非常糟糕,因此在现代CPU设计中会使用更复杂的设计。
Voo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.