stringstream unsigned conversion打破了吗?

Ste*_*lly 4 c++ iostream stringstream

考虑这个程序:

#include <iostream>
#include <string>
#include <sstream>
#include <cassert>

int main()
{
    std::istringstream stream( "-1" );
    unsigned short n = 0;
    stream >> n;
    assert( stream.fail() && n == 0 );
    std::cout << "can't convert -1 to unsigned short" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在OS X 10.5.6上的gcc(版本4.0.1 Apple Inc. build 5490)上试过这个,断言是真的; 它无法将-1转换为unsigned short.

但是,在Visual Studio 2005(和2008)中,断言失败,结果n的值与编译器生成的隐式转换的结果相同 - 即"-1"为65535," - 2"为65534等但随后在"-32769"变得奇怪,转换为32767.

谁是对的,谁在这里错了?(而且-32769到底发生了什么?)

小智 5

GCC在Max Lybbert的帖子中声称的行为是基于C++标准的表格,它将iostream行为映射到printf/scanf转换器(或者至少是那个;我的阅读).但是,g ++的scanf行为似乎与istream行为不同:

#include <iostream>
#include <cstdio>
using namespace std;;

int main()
{
    unsigned short n = 0;
    if ( ! sscanf( "-1", "%hu", &n ) ) {
        cout << "conversion failed\n";
    }
    else {
        cout << n << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

实际打印65535.