unsigned int
オーバーフローすると何が含まれますか?具体的には、2つunsigned int
のsで乗算を行いたいのですunsigned int
が、乗算が終了した後はどうなりますか?
unsigned int someint = 253473829*13482018273;
unsigned int
オーバーフローすると何が含まれますか?具体的には、2つunsigned int
のsで乗算を行いたいのですunsigned int
が、乗算が終了した後はどうなりますか?
unsigned int someint = 253473829*13482018273;
unsigned
数値はオーバーフローできませんが、代わりにモジュロのプロパティを使用してラップアラウンドします。
たとえば、unsigned int
が32ビットの場合、結果は次のようになります(a * b) mod 2^32
。
CharlesBaileyが指摘したように、253473829*13482018273
変換される前に符号付き乗算を使用する可能性があるため、乗算の前に明示する必要がありますunsigned
。
unsigned int someint = 253473829U * 13482018273U;
符号なし整数オーバーフローは、符号付き整数オーバーフローとは異なり、明確に定義された動作を示します。
値は基本的に「ラップアラウンド」します。これは安全で、カウントダウンやハッシュ/mod関数によく使用されます。
おそらくコンパイラに少し依存します。数年前のようなエラーが発生しました。ランタイムエラーが発生することもありますが、基本的には、最上位ビットを切り取って残りを残すことで発生する非常に小さな数に「ラップ」バックすることもあります。つまり、32の場合です。 bit unsigned intであり、乗算の結果は34ビットの数値になり、上位2ビットを切り落とし、余りを与えます。コンパイラで試して、何が得られるかを正確に確認する必要があります。これは、別のコンパイラで得られるものとは異なる場合があります。特に、最終結果が内にある式の途中でオーバーフローが発生した場合はそうです。 unsignedintの範囲。