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

如何处理溢出情况?[重复]

宋景福
2023-03-14

我只是想知道,谁负责处理计算机中的数学溢出案例?

例如,在以下C代码中:

short x = 32768;
std::cout << x;

在我的机器上编译并运行这段代码得到了-32767的结果

“short”变量的大小为2字节。。我们知道2个字节可以容纳32767的最大十进制值(如果有符号的话)。。所以当我把32768分配给x。。超过其最大值32767。。它开始从-32767再次计数到32767,以此类推。。在这种情况下,到底发生了什么,所以给出了-32767的值?也就是说,在产生这个值的背景下进行的二进制计算是什么?

那么,是谁决定发生这种情况的?我的意思是谁负责决定当我的程序中发生数学溢出时...变量的值只是从其最小值重新开始,或者例如抛出异常,或者程序只是冻结...等等?

是语言标准、编译器、我的操作系统、我的CPU,还是谁?它是如何处理这种溢出情况的?(请提供简单解释或详细解释的链接:))

顺便说一句,请。。此外,谁来决定我的机器上的“短整数”的大小?它也是一种语言标准、编译器、操作系统、CPU。。等

提前感谢!:)

编辑:好的,我从这里理解了:为什么定义了无符号整数溢出行为,但没有定义有符号整数溢出行为?

是处理器定义了溢出情况下发生的事情(例如在我的机器中,它从头开始-32767),这取决于处理器的“符号值的表示”,即。是符号大小、一个补码还是两个补码...

是这样吗?在我的例子中(当给出的结果类似于再次从最小值-32767开始..你认为我的CPU是如何表示有符号的值的,例如,值-32767是如何出现的(同样,导致这个结果的二进制计算,请:)?)

共有1个答案

吕宸
2023-03-14

它不是从它本身的最小值开始的。它只是截断它的值,所以对于一个4位的数字,可以一直计数到1111(二进制,=15十进制)。如果你增加1,你会得到10000,但是没有空间,所以第一个数字会被删除,而0000会保留下来。如果你计算111110,你会得到1

您可以像在纸上一样将它们相加:

  1111
  0010
  ---- +
 10001

但是处理器不会把整个数字加起来,而是一直加起来,直到它达到(在这种情况下)4位。之后,没有更多的空间再加起来,但是如果还有1要“进位”,它会设置溢出寄存器,这样你就可以检查它最后一次加法是否溢出了。

处理器有计算数字的基本指令,也有计算较小和较大数值的指令。64位处理器可以将64位数字相加(实际上,它们通常不会将两个数字相加,而是在第一个数字的基础上添加第二个数字,修改第一个数字,但这对故事来说并不重要)。

但除了64位之外,它们通常还可以将32、16和8位数字相加。这在一定程度上是因为,如果你不需要更多的数据,只需要将8位的数据相加是很有效的,但有时也需要与以前版本的处理器的旧程序向后兼容,这些处理器的数据相加可以达到32位,但不能达到64位。

这样的程序使用一条指令来累加32位的数字,64位处理器上也必须存在相同的指令,如果出现溢出,也必须有相同的行为,否则程序将无法在较新的处理器上正常运行。

除了使用处理器的核心结构进行累加外,还可以在软件中进行累加。您可以制作一个inc函数,将一大块位作为单个值处理。要增加它,可以让处理器增加前64位。结果存储在块的第一部分。如果在处理器中设置了溢出标志,则取下64位并将其递增。通过这种方式,您可以扩展处理器的限制,以处理来自软件的大量数据。

溢出的处理方式也是如此。处理器只是设置标志。您的应用程序可以决定是否对其采取行动。如果你想要一个计数器只增加到65535,然后换行到0,你(你的程序)不需要对这个标志做任何事情。

 类似资料:
  • 本文向大家介绍栈溢出有哪些情况?相关面试题,主要包含被问及栈溢出有哪些情况?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。 2)、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。3)、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

  • 在CSS中,如果设置了一个盒子的宽度与高度,则盒子中的内容就可能超过盒子本身的宽度或高度。此时,可以使用 overflow 属性来控制内容溢出时的处理方式。 overflow属性的可选值有 visible | hidden | scroll | auto,除了body 和 textarea 的默认值为auto外,其它元素的默认值为visible。 如果不设置 overflow属性,则默认值就是 v

  • 问题是:整数的倒数。 示例1:x=123,返回321 例2:x=-123,返回-321 你注意到反整数可能会溢出吗?假设输入是32位整数,则100000003溢出的相反值。你应该如何处理此类案件? 抛出异常?很好,但是如果抛出异常不是一个选项呢?然后必须重新设计函数(即,添加一个额外的参数)。 从我搜索的网站的解决方案是: 但是,当时,控制台会打印,而不是。因此,如果我们不能使用异常,这个解决方案

  • 我已经创建了一个队列。生产者持续发布到JMS队列。但是,使用者需要一些时间来处理消息,一段时间后队列就会满。 如何在生产者端(即Java应用程序)和JMS代理上处理这种情况?

  • 问题内容: Java如何处理整数下溢和上溢? 由此,您将如何检查/测试这种情况的发生? 问题答案: 如果溢出,它将返回最小值并从那里继续。如果下溢,它将返回最大值并从那里继续。 你可以按如下方式事先检查: (可以替代由执行相同的检查) 如果你认为这种情况可能发生的次数更多,那么请考虑使用可以存储较大值(例如long或)的数据类型或对象。最后一个不会溢出,实际上,可用的JVM内存是限制。 如果你碰巧

  • 假设我有一个旋转90度的正方形(我发现这是为我的计算机准备的)和一个旋转75度的第二个正方形。第一个正方形的左上角和第二个正方形的左下角相连。 我的目标是使用三角学来编辑第二个正方形的位置,以便它的右下角和第一个正方形的右上角(两个高亮的角)连接起来。 在一张不太硬的纸上。我会用sin和cos来求x和y的偏移量。在本例中,代码类似于: