Рассмотрим эту программу:
#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 в беззнаковый шорт.
Однако в Visual Studio 2005 (и 2008) утверждение не выполняется, и результирующее значение n совпадает с ожидаемым при неявном преобразовании, сгенерированном компилятором, то есть «-1» равно 65535, «-2» равно 65534 и т. Д. Но тогда это становится странным в "-32769", который преобразуется в 32767.
Кто прав, а кто здесь не прав? (И что, черт возьми, происходит с -32769 ??)