我只是想知道,谁负责处理计算机中的数学溢出情况?如何处理溢出情况?
例如,在下面的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如何出现(再次,二进制计算导致这个,请问:)?)
恕我直言,无符号值环绕,他们不溢出。不同。 –
*“谁决定发生这种情况?”*这真的是你的问题吗?你想要一个名字? –
那么C99标准说明了无符号整数溢出(6.2.5.9)会发生什么。带符号的整数溢出未定义,因此在这种情况下可能发生任何事情。 – NathanOliver