C++ 中的溢出数字 (Visual Studio 2013)

Posted

技术标签:

【中文标题】C++ 中的溢出数字 (Visual Studio 2013)【英文标题】:overflow numbers in C++ (Visual Studio 2013) 【发布时间】:2013-11-29 06:26:50 【问题描述】:

我有一个简单的程序:

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])

    unsigned short a;
    cin >> a;
    cout << a;
    return 0;

当我输入一个大于 65535(溢出数)的数字时,我总是收到 52428 作为输出。当我输入一个小于 0 的数字(下溢数字)时,输出如预期的那样(例如:输入 -1 将有输出 65535)。

我用的是Visual Studio 2013 Ultimate,我朋友也在用Visual Studio 2010编译这个程序,结果和上面一样。

那么大于 65535 的数字(溢出数字)究竟是怎么回事?

提前致谢。


您好,我发现另外两个主题可以帮助您:

How does an uninitiliazed variable get a garbage value?

garbage values in C/C++

谢谢大家回答我的问题。

【问题讨论】:

尝试初始化a,例如使用 0,看看在这种情况下输出是否看起来很熟悉。 @molbdnilo 我试了一下,如果我用值 10 初始化 a,不管输入是什么,输出也是 10。 【参考方案1】:

52428 是十六进制的 CCCC;它很可能正在使用调试内存作为值。如果您使用 Release 配置编译和运行,您可能会得到不同的结果,因为它是真正未初始化的。

【讨论】:

调试内存是什么意思? 在调试模式下,MSVC 用特殊模式填充未初始化的内存。 “CCCC”是其中之一,但也使用了 IIRC“FEEE”和“CDCD”。 @MSalters:但这不会发生在下溢吗? 它发生在读取之前,无论读取之后会做什么。问题是,如果读取失败,内存保持未初始化。 @MSalters:“在读取之前”,您的意思是在代码行“cin >> a;”之前(或类似的东西)被执行? “如果读取失败”,那么如果输入上溢数就认为读取失败,那么为什么不认为输入下溢数会导致读取失败呢?对不起我的英语不好。【参考方案2】:

最好这样检查输入的正确性:

std::cin >> a;
if (std::cin.fail())
  std::cout << "Error!\n";
else
  std::cout << "Valid.\n";

【讨论】:

或者只是if (std::cin &gt;&gt; a) std::cout &lt;&lt; "Success:" &lt;&lt; a; else std::cout &lt;&lt; "Error";

以上是关于C++ 中的溢出数字 (Visual Studio 2013)的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

C ++(Visual Studio),无法将数字“10”写入文件,所有其他数字都有效吗?

用microsoft visual studio 2008执行C语言出现栈溢出怎么解决?

Microsoft visual c++弹窗?

为啥 C++ 中的 Visual Studio 不如 C# 中的智能? [关闭]

DLL 中的 Python (c++) Visual Studio