私は以前のプログラマを編集していたコードでは、shift演算子を使ってsize_tの整数に適度に大きな数を加えました。デバッグの目的でこの特定の整数で試合をしたときに、数値を変更しても予測可能な結果が得られないことがわかりました。シフト演算子(C++)でランダムな結果が得られるのはなぜですか?
入力:
std::size_t
foo1 = 100000 << 20,
foo2 = 200000 << 20,
foo3 = 300000 << 20,
foo4 = 400000 << 20;
std::cout << "foos1-4:";
std::cout << foo1;
std::cout << foo2;
std::cout << foo3;
std::cout << foo4;
利回り:
foos1-4:
1778384896
18446744072971354112
1040187392
18446744072233156608
私はそれがオーバーフローエラーのいくつかの種類ですけど、(私確かに限られた知識に)size_tのは、それらを持つことが想定されていません。私が理解しているところから、size_tは事実上無制限の整数を保持できる符号なし整数型です。
私はビットシフト演算子について理解しているので、このコードは2^20(1048576)の数を掛ける必要があります。このサイトの他のページへのリンク: What are bitwise shift (bit-shift) operators and how do they work?
注 - 私はfoo1が32バイナリ桁の切り捨てでオーバーフローエラーであるように見えましたが、他のすべてはまったくランダムなようです。
http://en.cppreference.com/w/cpp/types/size_t: std :: size_tは理論的に可能な任意のタイプ(配列を含む)のオブジェクトの最大サイズを格納できます。それでは、整数が宣言されているかビットシフトがどのように動作しているかの問題があると思います。
何が起こっているのですか?
'size_t'は「事実上無制限」ではありません。任意のオブジェクトのサイズ*をバイト数で示すのに十分な大きさであることが保証されています。実際には、[cppreferenceでサンプルコードをコンパイルするために使用される実装は、最大値が '18446744073709551615'(http://en.cppreference.com/w/cpp/types/numeric_limits/max#Example)ですが、これは実際には必要最低限よりもはるかに大きい。 –