C++ 如何处理溢出情况?

C++ 如何处理溢出情况?,c++,overflow,cpu,C++,Overflow,Cpu,我只是想知道,谁负责处理计算机中的数学溢出情况 例如,在下面的C++代码中: short x = 32768; std::cout << x; short x=32768; std::cout它本身并不是从它的最小值开始的。它只是截断其值,因此对于4位数字,可以一直计数到1111(二进制,=15位十进制)。如果按1递增,则会得到10000,但没有空间,因此第一个数字会被删除,而0000会保留下来。如果你计算1111+10,你会得到1 您可以像在纸上一样将它们相加: 1111

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

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

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

std::cout它本身并不是从它的最小值开始的。它只是截断其值,因此对于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,那么您(您的程序)不需要对该标志执行任何操作。

IMHO,无符号值换行,它们不会溢出。不同。“谁决定了会发生这种事?”这真的是你的问题吗?你想要一个名字吗?C99标准说明了无符号整数溢出(6.2.5.9)的情况。有符号整数溢出是未定义的,因此在这种情况下可能会发生任何情况。谢谢大家的帮助:)很抱歉,我不知道关于无符号值的情况,我不是有意要求将这种特殊情况作为无符号值。。这只是一个例子来说明我的问题。。我想知道一般情况,谢谢你提供了关于无符号值的信息,我编辑了这个问题来澄清我在示例中使用有符号值的意思现在,有符号值溢出会导致未定义的行为,机器处理器定义了在溢出的情况下会发生什么,是处理器处理好了吗。无论如何,我现在将阅读你对答案的编辑:)你请阅读我对问题的编辑,如果你看到你可以在答案中添加任何其他内容(我还没有阅读你的编辑),请执行:)谢谢你,戈雷斯:)“处理器只是设置了标志。你的应用程序可以决定是否对其进行操作。”应用程序如何操作?你的意思是当设置溢出标志时,会引发异常,如果应用程序的代码捕捉到该异常,它就可以在那里处理该溢出?我真的很抱歉,但我很困惑:(…好吧,现在让我问这个问题的是我在某本书中读到的一句话..我现在只想得到答案,就这些,请帮帮我:)。。。这本书上写的是。。。(在pascal中,“假设一个2字节变量”,加上32767+1总是得到值-32767,加上32767+2得到值-32766。我是说这样说对吗?我们可以说。。在C++中,当溢出发生时,BLA BLA总是发生“?我的意思是,这应该取决于CPU,而不是语言标准,结果会因机器而异,对吗?