示例:
int max = a > b ? a : b;
int min = a + b - max;
是什么决定了这是否可行?处理器?硬件?语言?帮助我尽可能深入地理解这一点。
处理器就是硬件(至少就本问题而言)。
该语言纯粹是一种表达事物的方式,允许它将其转换为处理器本身所期望的内容。在这里,语言的作用是定义"int"的含义,算术运算符是什么/做什么,以及它们的异常行为是什么。在低级语言(如C/C++)中,有几件事需要"实现定义",如整数的溢出行为。其他语言(如Python)可能会将"int"定义为一个抽象(而非硬件)概念,从而更改一些规则(如检测溢出和执行自定义行为)。
如果该语言留下了定义的实现,并且该实现将该决策转移到硬件,那么硬件就是定义代码行为的东西。
高级编程语言为人类描述他们想要发生的事情提供了一种方式。编译器将其简化为处理器理解的语言,(最终)机器代码。特定处理器的指令集设计用于执行任务,通用处理器用于执行通用任务,包括您所描述的任务。与纸笔数学不同的是,如果我们需要另一列10的幂,99+1=100,例如两位数宽,三位数宽。处理器的寄存器有一个固定的",这并不意味着你不能发挥创造力,但语言和资源(内存、磁盘空间等)有限制。通常情况下,直接在逻辑中的处理器或实现正确指令序列的编译器可以并且将检测到溢出。有些处理器比其他处理器更难,有些处理器不够通用,但我认为我们不需要担心这些,你正在阅读这个网页的处理器肯定可以处理这个问题。
计算机(硬件)用2的补码表示数字。请检查此项以了解二的补码的详细信息,以及计算机使用它的原因。
在二的补码中,有符号的数字(为了简单起见,现在不是浮点数字)有一个符号位作为最高有效位。例如:
01111111
在2的补码中表示127。和
10000000
表示-128。在这两个例子中,第一个比特都是符号比特,如果它是0,那么这个数字就是正的,否则就是负的。
8位有符号数字可以表示-128到127之间的数字,所以如果你把127和3加起来,你不会得到130,你会得到-126,因为溢出。让我们看看原因:
01111111
00000011
+________
10000010 which is a negative number, -126 in two's complement.
硬件如何理解是否发生溢出?此外,例如,如果将两个正数相加,结果为负数,则表示溢出。若你们加上两个负数,结果为正数,就意味着再次溢出。
我希望这将是一个很好的例子,说明这些事情是如何在硬件层面发生的。