这听起来像是一个愚蠢的问题,但我真的很想知道计算机如何知道$ 1 <2 $?另外,计算机如何知道整数的顺序为$ 1,2,3,4,5, ldots $,而字母为a,b,c,d,...?它是存储在硬件中的某个地方还是操作系统提供此类信息?

有帮助吗?

解决方案

首先,您的整数数字转换为二进制数字。例如,整数2转换为0010。

CPU使用 数字比较器:

一个 数字比较器 或大小比较器是一种硬件电子设备,以二进制形式为输入,并确定一个数字是大于还是小于或小于或等于其他数字。

比较器用于中央处理单元(CPU)和微控制器。

资源: https://en.wikipedia.org/wiki/digital_comparator

在比较器硬件中,使用了一些门(以及,或者,nand,nor,xor等)。这些大门采用二进制输入并产生二进制。可以从真实表中看到输出。

Inputs           Outputs
A   B     A>B    A=B    A<B
0   0     0       1      0
0   1     0       0      1
1   0     1       0      0
1   1     0       1      0

这里 0 & 1 是门的电子电压。
1 - 表示一定的阈值电压,表明某些正电压。
0 - 表示低于阈值的电压。

例如,假设一个比较器在5伏上有效(考虑说明是考虑):
电压超过3伏可被视为 binary-1.
低于3伏的电压被认为是 binary-0

如果一个门获得一个输入为3.5伏,另一个输入为2伏,则将其视为,将一个输入作为二进制1,另一个输入为二进制0。

通过开关电路非常快捷地提供1和0的序列。

两位数字比较器的操作可以表示为真实表:

 Inputs                            Outputs
   A1   A0  B1  B0  A>B    A=B   A<B        
    0   0   0   0    0      1     0
    0   0   0   1    1      0     0
    0   0   1   0    1      0     0
    0   0   1   1    1      0     0
    0   1   0   0    0      0     1
    0   1   0   1    0      1     0
    0   1   1   0    1      0     0
    0   1   1   1    1      0     0
    1   0   0   0    0      0     1
    1   0   0   1    0      0     1
    1   0   1   0    0      1     0
    1   0   1   1    1      0     0
    1   1   0   0    0      0     1
    1   1   0   1    0      0     1
    1   1   1   0    0      0     1
    1   1   1   1    0      1     0

引用 维基百科:

示例:考虑两个4位二进制数字A和B
enter image description here
enter image description here
这里每个下标代表数字中的数字之一。

平等

如果所有两个数字的显着数字相等,即
enter image description here . enter image description here . enter image description here. enter image description here

由于数字为二进制 enter image description here 和> enter image description here 可以表示为
enter image description here

enter image description here 只有1 enter image description hereenter image description here 相等。

对于A和B的平等,所有人 enter image description here 变量(对于i = 0,1,2,3)必须为1。因此,可以使用该操作作为A和B的质量条件
enter image description here
二进制变量(a = b)仅在两个数字的所有数字对等相等时才为1。

不等式

为了手动确定两个二进制数中的较大数量,我们检查了一对显着数字的相对幅度,从最重要的位开始,逐渐朝着较低的显着位前进,直到发现不平等。当发现不等式时,如果A的相应位为1,而B的相应位为0,那么我们得出结论A> b。该顺序比较可以在逻辑上表示为:

enter image description here

其他提示

它不仅“知道”,而且每次检查。基本上,它可以执行与您要做的相同的事情:为了比较,它(从左侧)检查哪个数字的数字大于另一个数字中的数字。当然,您必须将引导零添加到较短的数字中。

字母只是计算机的数字。人类分配了数字,例如 ASCII 或者 Unicode, ,给字母,以便该数字比较给出了字母的“正确”订单。

比较整数的不是操作系统,CPU正在照顾它。它是在逻辑大门上进行的,请参考 这些幻灯片 看看如何完成。

关于字母,在 ASCII 字母数字和其他特殊字符表示为整数,因此比较它们也是CPU执行的整数比较操作。

实际上,为了获得它的完整图像,我认为用自己的眼睛看到实际CPU的数据,例如MIPS:enter image description here

如您所见,实际上有第二个来自ALU的输出,这是一个称为零的信号。它的存在是为了执行快速分支操作,确定 比较的两个操作数是否等于零, ,因为程序中的大多数比较都是关于分支的。因此,当您在代码中创建分支机构时,例如:

如果(a <b){...}

例如,将其翻译成Mips中的机器代码:例如: blt s0,s1,如果 $〜 rightArrow $如果a <b在括号中执行指令,则继续执行if {}之外的执行。具体而言,该指令是伪指令,这意味着将其翻译成另外两个(简单)MIPS指令$〜 rightarrow $
SLT AT,S0,S1 接着 bne在零,如果 (SLT:设置小于&bne:分支不相等)。

请注意,Signal Zero是确定程序计数器(PC)在何处获得其值的输入之一:假设分支信号为“ 1”,因为我们有分支机构操作

  • 零= 0 $ rightArrow $减法结果不等于零,因此多路复用器将从分支目标中选择地址,并且执行将从分支领导的指令中继续。
  • 零= 1 $ rightArrow $结果为0(a = b),因此MUX从ADDER中选择地址,在哪里计算出正常执行(串行)中下一个指令的地址。由于条件(a <b)无效,因此没有执行跳跃。

希望我能帮助您看到“帽子下”。随时要求对此事进行进一步分析。我们认为,许多事情是理所当然的,CPU以一种非常有趣的方式做到了!

如果您想知道实际CPU是如何做到的,那就是这样。

CPU仅在一定尺寸的数字上运行。如今,通常是64位整数(我们会忽略浮点数;这个想法将是相似的)。

所以我们应该认识到

  1. CPU将数字存储到(例如)64位,以某种格式(可能是) 2s组合 但这没关系)。

  2. CPU不能用比这更大的数字来本地做任何事情。如果要比较更大的数字,我们必须编写软件算法。

好的,所以说我们有两个数字,每个数字都适合正常大小的64位整数。说$ a $和$ b $。处理器如何比较它们?通常,它会从另一个中减去一个(这是硬件中实现的单个本机操作)。

现在,处理器存储了一个数字$ ab $。同样,这个数字最多是64位,因此它适合一个64位长的“寄存器”,这是我们存储数字进行计算的地方。现在,它只是检查$ AB $是否小于零。它可以使用单个本机操作,该操作可以在电路级别上起作用,例如其他答案所描述的比较算法。它看起来很像这些,但是所有这些都在电路中实现(因为数字为最大64位,这是我们可以硬化并粘在CPU上的一定大小的电路。可能会更快,因为可能所有负数都将第一个位设置为一个或类似的位置。无论哪种方式,总共只有64位,因此我们绝对可以检查此数字是否为负。

如果是,那么我们知道$ a <b $;如果没有,那么我们知道$ a geq b $。

现在,对于更大的数字,我们必须在软件中实现这些小型比较作为子例程的东西。

要回答这个问题,让我首先指出,在计算机上的比较编号至少有两个级别 机器级, ,和 软件级别.

比较机器级别上的数字

在今天的计算机中,CPU具有丰富的指导。这些说明包括例如将存储单元加载到寄存器中,增加寄存器,添加两个寄存器以及更多内容。还必须有指示 有条件跳跃. 。例如,英特尔X86家庭中的处理器支持说明 jnz (如果不是零), jne (跳跃不相等),依此类推。如果这些缺少这些,则CPU将不会完整。条件跳跃取决于的变量存储在寄存器中。因此,这些说明是在CPU的体系结构中用逻辑门构建的构建中的。这是CPU可以做的唯一方法 相比 两个数字。

比较软件级别上的数字

如果您比较两个数字,例如在C ++程序中,则将其转换为机器代码,因此在机器级别进行。但是,这种比较可能更复杂。这实际上取决于您使用的数据类型,如何将比较转换为机器代码。仅一个例子,您要比较的数字来自64个单词,但您的计算机只能与32位一起使用。那么此数字不适合寄存器,因此编译器将将比较分解为机器代码级别上的一系列比较。同样的适用于更复杂的数据类型/数据结构,例如有理数,字符串或字符。因此,当您必须比较两个字符时,这是由软件(操作系统,编译器,解释器等)翻译成机器代码。实际翻译取决于字符/数字的编码。

最后,我想指出的是,标准CPU还可以与数字的不同表示(1或2组成表示,浮点)。还可以在计算机的其他部分(例如GPU)进行比较。

其他答案很好,只是将另一个扔到那里以进行进一步的考虑/洞察力,并具有CS风味/扭曲。一个人可以构建 FSM, ,可以比较任何长度的两个二进制数字的有限状态机,从最重要的位开始成对从最不重要的位开始(LSB)。它也可以用来概念化另一个答案中给出的数字比较器,但是FSM不需要有限的长度二进制数字。它甚至可以在LSB之后使用二元分数的整数工作。它具有感应性和递归风味,可以通过简单的诱导证明正确。它运行如下:

  • 将顶部两个二进制数字作为一对(a,b)输入
  • 如果a = 1和b = 0,则左数更大。
  • 如果a = 0和b = 1,则正确的数字更大。
  • 否则,数字是“现在相等的”,请前往下一个对。

换句话说,最大的数字是首次出现的位,一个是一个位,另一个是零之后,在零或更多相同的1之后。由门或1位比较器制成的有限长度数字比较器可以看作是基于将FSM操作的长度固定到一些固定数量的位。 (是的,所有有限电路与FSM计算的“固定长度”之间都有很强的对应关系。)

这似乎是一种理论练习,但实际上,软件中的逻辑代表 任意精度 数字 操作类似于此FSM的东西,除了在计算机循环中编码的东西可以看作是循环或模拟FSM的步骤(有效的实现可能通过索引跟踪MSB的位置)。


另外,让我们合理地解释/推广这个问题 不限于整数. 。问题是指整数,但标题仅指数字。令人惊讶的是没有人提到 浮点算术 至今。

基本上是通过比较 指数尾数 其中一个数字为$ a times 10^b $,$ a $ the Mantissa,b the exponent。可以将Mantissa标准化为第一位数字始终非零的数字。然后,要比较两个数字,逻辑首先比较指数$ b $,如果它们不相等,它可以返回结果而无需比较鼠标(使用比较器电路)。如果指数相等,则比较鼠标。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top