为什么整数溢出会导致C++ iostream出错?

Mai*_*ter 5 c++ integer-overflow

好吧,所以我对C++ iostream有一些问题感觉非常奇怪,但它可能是定义的行为,考虑到MSVC++和G ++都会发生这种情况.

说我有这个程序:

#include <iostream>
using namespace std;

int main()
{
   int a;
   cin >> a;
   cout << a << endl;
   cin >> a;
   cout << a << endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我故意通过给第一个cin一个大于int的最大限制的值来溢出,所有进一步的调用cin.operator>>()将由于某种原因立即返回,并a设置为某个值.该值似乎未定义.

为什么以及这种行为记录在哪里?有没有办法弄清楚是否发生了这样的溢出?

此外,这个类似的程序似乎按照我的意图工作.如果我溢出该值,它将给出a一些值,并继续,就像溢出从未发生过一样.

#include <cstdio>
using namespace std;

int main()
{
   int a;
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 7

iostream用于检测错误并进入错误状态.从整数溢出中获得与输入非数字字符串相同的结果.

转换cin(或任何流)bool或检查cin.rdstate()以确定是否发生了错误.

调用cin.clear()cin.ignore()清除错误.它将在失败的角色处拾取.

至于官方文件,标准不幸在iostreams的内容中有点难以理解.见§27.6.1.2.1,27.6.1.2.2和22.2.2.1.1/11(不开玩笑):

- 阶段2中累积的字符序列会导致scanf报告输入失败.ios_base :: failbit被分配给err.

scanf文档同样难以理解,我会相信溢出应该是一个错误.