Почему unsigned short * unsigned short
преобразован в int
в С++ 11?
int
слишком мал, чтобы обрабатывать максимальные значения, как показано в этой строке кода.
cout << USHRT_MAX * USHRT_MAX << endl;
переполняется на MinGW 4.9.2
-131071
потому что (источник)
USHRT_MAX = 65535 (2 ^ 16-1) или больше *
INT_MAX = 32767 (2 ^ 15-1) или более *
и (2^16-1)*(2^16-1) = ~2^32
.
Должен ли я ожидать каких-либо проблем с этим решением?
unsigned u = static_cast<unsigned>(t*t);
Эта программа
unsigned short t;
cout<<typeid(t).name()<<endl;
cout<<typeid(t*t).name()<<endl;
выводит вывод
t
i
о
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
gcc version 4.8.2 (GCC)
MinGW 4.9.2
с обоими
g++ p.cpp
g++ -std=c++11 p.cpp
что доказывает, что t*t
преобразуется в int
в этих компиляторах.
Полезные ресурсы:
Подписано на неподписанное преобразование в C - всегда ли оно безопасно?
Целочисленное умножение с подписью и без знака
https://bytes.com/topic/c-sharp/answers/223883-multiplication-types-smaller-than-int-yields-int
http://www.cplusplus.com/reference/climits
http://en.cppreference.com/w/cpp/language/types
Изменить: Я продемонстрировал проблему на следующем изображении.