が C++11 にunsigned short * unsigned short
変換されるのはなぜですか?int
この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
役立つリソース:
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
編集:次の画像で問題を示しました。