【问题标题】:What determines the result of overflowed operations? [closed]什么决定了溢出操作的结果? [关闭]
【发布时间】:2026-01-26 12:25:01
【问题描述】:

示例:

int max = a > b ? a : b;
int min = a + b - max;

是什么决定了这是否可行?处理器?硬件?语言?帮助我尽可能深入地理解这一点。

【问题讨论】:

  • 我相信“return”这个词让你的问题很混乱。
  • @iAdjunct 那是一种o型。我刚刚修好了。对不起。
  • 这个问题与算法、浮点数或位操作有什么关系?

标签: algorithm floating-point bit-manipulation hardware integer-overflow


【解决方案1】:

处理器是硬件(至少就本问题而言)。

该语言纯粹是一种让您表达事物的方式,以使其能够将其转换为处理器本身所期望的。这里语言的作用是定义“int”的含义,算术运算符是/做什么,以及它们的异常行为是什么。在低级语言(如 C/C++)中,它留下了一些“实现定义”的东西,比如整数的溢出行为。其他语言(如 Python)可能将“int”定义为抽象(而非硬件)概念,从而改变一些规则(如检测溢出和执行自定义行为)。

如果语言留下了定义的实现,并且实现将该决定卸载到硬件,那么硬件就是定义代码行为的东西。

【讨论】:

    【解决方案2】:

    高级编程语言为人类提供了一种描述他们想要发生的事情的方式。编译器将其简化为处理器可以理解的语言,(最终)机器代码。特定处理器的指令集旨在用于执行任务,通用处理器用于通用任务,包括您所描述的任务。与铅笔和纸数学不同,如果我们需要另一列,则需要另一个十的幂,例如 99+1 = 100 输入两位宽,输入 3 位。处理器有一个固定的寄存器,这并不意味着你不能发挥创造力,但语言和资源(内存、磁盘空间等)有限制。通常,如果您要求,处理器直接在逻辑中或执行正确指令序列的编译器可以并且将检测到溢出。有些处理器比其他处理器更难,有些处理器不够通用,但我认为我们不需要担心这些,你正在阅读这个网页的那个肯定可以处理这个。

    【讨论】:

      【解决方案3】:

      计算机(硬件)用二进制补码表示数字。查看this 了解二进制补码的详细信息以及计算机使用它的原因。

      在二进制补码中,有符号数(为了简单起见,暂时不是浮点数)有一个符号位作为最高有效位。例如:

      01111111
      

      表示二进制补码中的 127。和

      10000000
      

      代表-128。在这两个例子中,第一位都是符号位,如果是0,则数字为正数,否则为负数。

      8 位有符号数可以表示 -128 和 127 之间的数字,所以如果将 127 和 3 相加,则不会得到 130,因为溢出会得到 -126。让我们看看为什么:

       01111111
       00000011
      +________
       10000010 which is a negative number, -126 in two's complement.
      

      硬件如何理解是否发生溢出?另外例如,如果两个正数相加,结果为负数,则表示溢出。如果你把两个负数相加,结果是正数,这意味着再次溢出。

      我希望这是一个很好的例子,说明这些事情在硬件层面是如何发生的。

      【讨论】:

      • 您可能应该阅读您链接到自己的那篇文章
      • @harold 有什么问题?
      • 在二进制补码中,10000010 不是 -2,11111111 不是 -128,但我看到你已经发现了那个
      • 是的,是的,它发生了 :) 我现在正在纠正它们 :)
      • 01111111 + 00000011 仍然是 10000010,只是不是 -2
      最近更新 更多