Рассмотрим эту программу: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;
}
Я попробовал это на GCC (версия 4.0.1 Apple, Inc. построить 5490) на OS X 10.5.6 и утверждение верно; он не может преобразовать -1 в unsigned short.
В Visual Studio 2005 (и 2008), однако, утверждение терпит неудачу, и результирующее значение n совпадает с тем, что вы ожидаете от генерируемого компилятором неявного преобразования, то есть «-1» составляет 65535, «-2», это 65534 и т. д. Но тогда это становится странным на «-32769», который преобразуется в 32767.
Кто такой, а кто здесь не прав? (А что, черт возьми, происходит с -32769 ??)
Вы можете проверить флаги формата по умолчанию, установленные на istringstream на Mac, используя флаги()? – dirkgently
, поскольку мы, кажется, не получаем поток ответов, я опубликовал небольшую измененную версию на clC++ m - http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/97475b21515462c9 # – 2009-04-24 21:47:56
Спасибо Нейлу. Боже, усложняется! Я вижу, что это не так просто, как я когда-то надеялся. –