当前位置: 首页 > 知识库问答 >
问题:

堆栈上溢和下溢[关闭]

谢建业
2023-03-14

(使用Java 15.0+)

我正在用这些实现一个堆栈

如何检查堆栈是否下溢?从Overflow boolean变量中,我们知道如果一个数字不能用8位来表示,就会导致溢出。但是,如果数字不能以这种方式表示,我们如何检查呢?我还认为应该有更多的情况下堆栈溢出,像jumpz或jumpn导致通过指令的无限循环。

共有2个答案

薛弘济
2023-03-14

你误会了。Carry/Overflow标志不跟踪“是当前堆栈顶部的值溢出”。它跟踪“您执行的最后一个可能溢出的操作,实际上是溢出的吗?”。addsubtract以及multiply操作可能会设置或清除该标志,其他操作完全不应该影响该标志(或者,如果您更喜欢每个操作都会设置该标志的设计,那么所有其他操作都必须清除该标志,例如push不可能溢出)。

你的问题的这一部分:

我还认为应该有更多的情况下堆栈溢出,像jumpz或jumpn导致通过指令的无限循环。

毫无意义。确定一个计算机程序是否会永远循环,从数学上来说是不可能的。计算机的工作是非常精确的定义;这里的“overflow”是指你尝试添加例如200+200,这是400,但这不适合8位,所以你得到的实际答案是144和一个进位标志。

‘这一跳将导致永远循环’是一个完全不同的概念。您可能需要一个标志,但它不应该是溢出标志(作为一个单独的isuse,不可能确定这一点)。

寿伟
2023-03-14

但是,如果数字不能以这种方式表示,我们如何检查呢?

使用int变量进行计算,然后检查该值是否超出范围。

例如,如果使用int表示sp寄存器:

int sp = ...

int temp = sp + N;  // or sp - N
if (temp > 255) {
    // set overflow flag
    sp = temp - 256;
} else if (temp < 0) {
    // set underflow flag
    sp = temp + 256;
} else {
    sp = temp;
}

您可能可以优化它...但代码将需要与上面的等价。

 类似资料:
  • im执行此任务,并不断在线程“main”java.lang.RuntimeException中获得异常:Stack.pop(postfix.java:74)、postfix.eval(postfix.java:221)和postfix.main(postfix.java:112)处的堆栈下溢 我不知道为什么我看着堆栈并且写得正确,我不明白为什么它在(3*4)/5时弹出的问题

  • 我写了以下内容: 解决4clojure.com的问题#118:http://www.4clojure.com/problem/118 当我询问时,不出所料,我会得到一个clojure.lang.lazyseq,但我不知道这与简单地删除lazy-seq“包装”有什么区别。 当然,现在如果删除lazy-seq,我会得到一个stackoverflow,为什么要执行这个: 否则(也就是说:如果我让lazy

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 问题内容: 现在,Stack Overflow使用redis,它们是否以相同的方式处理缓存失效?即散列到查询字符串+名称的身份列表(我想这个名称是某种用途或对象类型的名称)。 也许他们然后直接通过id(从一堆数据库索引中绕过,而是使用效率更高的聚集索引)直接从缓存中检索缺少的单个项。那会很聪明(杰夫提到的补液?)。 现在,我正在努力寻找一种简洁地解决所有问题的方法。在我自己进行初次切割之前,是否有