计算机如何确定一个数字是否小于另一个数字?


34

这听起来像是一个愚蠢的问题,但我真的很想知道计算机如何知道?另外,计算机如何知道整数的阶数是和字母是A,B,C,D,...?它存储在硬件中的某个位置还是操作系统提供了此类信息?1 2 3 4 5 ...1<21,2,3,4,5,


1
为了使该问题的回答令人满意,我们必须知道Ricky Stam对计算机体系结构了解多少。从这个问题来看,它似乎很少,所以下面的任何奇特的答案都不会让他理解。
Andrej Bauer

@AndrejBauer:实际上,自从问了问题以来他还没有登录。也许他现在知道了他所需要的。
戴夫·克拉克

Answers:


31

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

CPU使用数字比较器

数字比较器或幅度比较器是一个硬件电子设备,它有两个数字作为输入以二进制形式,并确定一个数是否大于或小于或等于另一个号码。

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

资料来源:https : //en.wikipedia.org/wiki/Digital_comparator

在比较器硬件中,使用了某些门(AND,OR,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

这里01是门的电子电压。
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,这样
在此处输入图片说明
在此处输入图片说明
每个下标代表数字中的一个数字。

平等

如果两个数字的所有有效数字对都相等,则二进制数A和B将相等
在此处输入图片说明在此处输入图片说明在此处输入图片说明在此处输入图片说明

由于数字是二进制的,所以数字可以是0或1,并且布尔函数等于任意两个数字,在此处输入图片说明并且> 在此处输入图片说明可以表示为
在此处输入图片说明

在此处输入图片说明 仅当在此处输入图片说明在此处输入图片说明 相等时为1 。

为了使A和B相等,所有在此处输入图片说明变量(对于i = 0、1、2、3)必须为1。因此,可以使用AND运算作为
在此处输入图片说明
二进制变量(A = B)来实现A和B的质量条件仅当两个数字的所有数字对均相等时才为1。

不等式

为了手动确定两个二进制数中的较大者,我们检查了有效数字对的相对大小,从最高有效位开始,逐渐向较低有效位前进,直到找到不等式。当发现不等式时,如果A的对应位为1,B的对应位为0,则可以得出A> B。此顺序比较可以在逻辑上表示为:

在此处输入图片说明


2
哇,这是怎么回事?
吉尔(Gilles)'所以

1
“首先将您的整数转换为二进制数” ...错误,首先在内存中只有二进制数,在机器级别只有1和0,所以没有“转换”,2是表示为10从开始到结束..
Dr.Haimovitz

从其他来源复制材料时,必须为您的来源提供适当的归属。看到这里这里
DW

两位数字比较器表不正确。ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf例如,当A1,A0都为零但B0和B1为0时,1 A> B将为0。
user1455116

14

它不仅“知道”,而且每次都会检查。基本上,它执行的操作与您做的相同:为了进行比较,它(从左侧开始)检查哪个数字的第一位数字大于另一个数字中的相应数字。当然,您必须在较短的数字前加上零。

字母只是计算机的数字。人们已经给字母分配了数字,例如ASCIIUnicode,以便数字比较也为字母提供“正确”的顺序。


同样,这通常被称为“ 词典顺序 ”。我们通常可以将其视为按长度(最短到最长)的第一顺序,然后按字母顺序。
usul 2012年

@usul这使我想起比较整数的细节显然取决于特定的编码。我描述的内容适用于“原始”二进制数字,可能与实际的CPU使用的数字相去甚远。
拉斐尔

是的,绝对。我最近一直在考虑Turing Machines :)。实机不太适合什么我们所有的时间....这里说的
美国UL

9

比较整数的不是操作系统,CPU在照顾它。它是在逻辑门级别上制作的,请参阅这些幻灯片以了解如何完成。

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


4

实际上,为了获得它的完整图像,我认为用肉眼查看实际CPU的数据路径(例如MIPS)将非常有帮助: 在此处输入图片说明

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

if(a <b){...}

  

注意,信号零是“与”门的输入之一,它决定程序计数器(PC)从何处获取其值:假设分支信号为“ 1”,因为我们有分支操作

希望我能帮助您看到“阀盖下”。随时要求对此事做进一步分析。我们将许多事情视为理所当然,CPU以一种非常有趣的方式来完成它们!


Ethan,“较少”操作如何在此数据路径上工作?据我了解,您将操作描述为“不相等”。“ slt”指令是什么?
osgx

2

如果您想知道实际的CPU是如何工作的,则就像这样。

CPU只能以一定大小运行。如今,通常是64位整数(我们将忽略浮点数;其想法将类似)。

所以我们应该认识到

  1. CPU以某种格式(可能是2s补码,但并不重要)以二进制格式存储(例如)64位长的数字。

  2. CPU本身无法执行大于此数字的任何操作。如果要比较更大的数字,我们必须编写软件算法。

ab

abab小于零。它使用一个可以在电路级工作的本地操作来完成此操作,就像其他答案描述的比较算法一样。它看起来很像,但是都是在电路中实现的(因为最大数量为64位,这是一个一定大小的电路,我们可以对其进行硬连线并粘贴在CPU上。)取决于CPU存储数字的方式,可能会更快,因为可能所有负数的第一位都设置为1或类似的值。无论哪种方式,总共只有64位,因此我们可以肯定地检查此数字是否为负。

a<bab

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


1

为了回答这个问题,让我首先指出,计算机上的比较数字至少有两个层次,即机器层次软件层次

在机器级别比较数字

在当今的计算机中,CPU具有丰富的指令集。这些指令包括,例如,将存储单元加载到寄存器中,增加一个寄存器,添加两个寄存器等等。还必须有条件跳转的说明。例如,英特尔x86家族中的处理器支持指令jnz(如果不为零则jne跳转),(不等于则跳转)等等。如果缺少这些内容,则CPU将无法完成图灵处理。条件跳转所依赖的变量存储在寄存器中。因此,这些指令作为从逻辑门构建的电路而硬连线到CPU的体系结构中。这是CPU 比较两个数字的唯一方法。

在软件级别比较数字

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

最后,我想指出的是,标准CPU也可以使用不同的数字表示形式(1-或2补码表示形式的有符号整数,浮点数)。还可以在计算机的其他部分(例如GPU)中进行比较。


0

其他答案也不错,只需将另外一个答案带CS风味/捻度进一步考虑/了解即可。可以构造一个FSM(有限状态机),该机器可以比较两个任意长度的二进制数,从成对的最高位开始到最低有效的位(LSB)成对开始。它也可以用于概念化另一个答案中给出的数字比较器,但是FSM不需要有限长度的二进制数。它甚至可以处理LSB之后具有二进制分数的整数。它具有归纳和递归的味道,可以通过简单归纳证明是正确的。它运行如下:

  • 输入成对的前两个二进制数字(a,b)
  • 如果a = 1且b = 0,则剩余数字更大。
  • 如果a = 0且b = 1,则正确的数字更大。
  • 否则数字是“直到现在相等”,前进到下一对。

换句话说,最大的数字是在零个或多个相同的1的初始运行后,第一次出现的比特为一个,另一个为零。可以将由门或1位比较器构成的有限长度数字比较器视为将此FSM操作的长度固定为一定数量的位。(是的,所有有限电路与FSM计算的“固定长度”之间都存在很强的对应关系。)

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


同样,让我们​​合理地解释/概括这个问题,不仅限于整数。问题是整数,但标题仅是数字。令人惊讶的是,到目前为止,没有人提到浮点运算

a×10bab

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.