2015-06-29 171 views
-2

我只是想知道,谁负责处理计算机中的数学溢出情况?如何处理溢出情况?

例如,在下面的C++代码:

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

编译和运行我的机器上这代码给我-32767

“短”可变的尺寸的结果是2个字节..我们知道2个字节可以保存32767的最大十进制值(如果有符号)..所以当我将32768赋给x ..在超过其最大值32767之后..它开始从-32767重新计数到32767等等.. 究竟发生了什么,所以在这种情况下给出的值是-32767? 即。在后台完成的二进制计算结果是什么?

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

它是语言标准,编译器,我的操作系统,我的CPU,还是它是谁? 它是如何处理溢出情况? (简单的解释或链接解释它的细节将不胜感激:))

而且,顺便说一句,还有,谁决定什么大小的'短整型'例如在我的机器上会是?它也是一种语言标准,编译器,操作系统,CPU等等。

在此先感谢! :)

编辑: 好了,所以我从这里了解:Why is unsigned integer overflow defined behavior but signed integer overflow isn't?

,它是谁定义溢出的情况发生了什么(例如像在我的机器从-32767又从头开始)处理器,取决于处理器的“签名值的表示”,即。它是符号幅度,补码还是二进制补码...

是吗? 和在我的情况(当给出的结果像是从最小值-32767再次开始......你如何假设我的CPU代表有符号值,以及例如值-32767如何出现(再次,二进制计算导致这个,请问:)?)

+0

恕我直言,无符号值环绕,他们不溢出。不同。 –

+0

*“谁决定发生这种情况?”*这真的是你的问题吗?你想要一个名字? –

+0

那么C99标准说明了无符号整数溢出(6.2.5.9)会发生什么。带符号的整数溢出未定义,因此在这种情况下可能发生任何事情。 – NathanOliver

回答

0

它不是从它的最小值本身开始。它只是截断其值,所以对于一个4位数字,您可以计数到1111(二进制,=十进制15)。如果您递增1,则会得到10000,但没有空间,因此第一个数字会丢失并且0000仍然存在。如果你计算1111 + 10,你会得到1

你可以把它们加起来,你会在纸上:

1111 
    0010 
    ---- + 
10001 

但是,而不是增加了整个数量,处理器只是补充,直到它到达(在这种情况下)4位。之后,再没有更多的空间可叠加了,但如果仍有1个“进位”,它会设置溢出寄存器,因此您可以检查最后一次添加是否溢出。

处理器有基本的指令来合计数字,并且它们具有较小和较大值。一个64位的处理器可以加起来64位的数字(实际上,通常他们不加起来两个数字,但实际上增加了第二个数字,修改第一个数字,但这对故事并不重要)。

但除了64位之外,它们通常也可以加起来32,16和8位数字。这部分是因为如果你不需要更多的东西,只需要添加8位就可以高效地工作,但是有时也可以向后兼容以前版本的处理器的旧版程序,该版本可以添加32位而不是64位。

这样的程序使用一个指令来加起来的32位数字,并且同样的指令也必须存在于64位处理器上,如果有溢出的话也会有相同的行为,否则程序将无法运行正确使用新的处理器。

除了使用处理器的核心结构进行合并外,还可以添加软件。你可以创建一个inc函数,将大块位作为单个值处理。为了增加它,你可以让处理器增加前64位。结果存储在块的第一部分。如果处理器中设置了溢出标志,则取下一个64位并递增。这样,您可以扩展处理器的限制,以便从软件处理大量数据。

同样的方式处理溢出。处理器只是设置标志。您的申请可以决定是否采取行动。如果你想拥有一个只增加到65535然后换成0的计数器,你(你的程序)不需要对该标志做任何事情。

+0

对不起,我不知道那些无符号值,我不是故意要求这个特殊情况作为无符号值。这只是一个例子来说明我的问题。我想知道一般情况,感谢btw提供有关无符号值的信息,我已经编辑了这个问题,以清除我在示例 –

+0

中的带符号值的含义,因此,带符号的值溢出会导致未定义的行为,机器处理器定义了在溢出情况下会发生什么,处理器是否正确处理? 。 。无论如何,我现在将阅读你的编辑答案:)你请阅读我的编辑问题,如果你看到你可以添加任何其他东西给你的答案(我还没有阅读你的编辑),请做:)谢谢你Golez :) –

+0

“处理器只是设置标志,你的应用程序可以决定是否采取行动。” 申请如何行事?你的意思是当溢出标志被设置时,会抛出一个异常,如果应用程序的代码捕获到异常,它可以在那里溢出? 我真的很抱歉,但我很困惑:(... ... –