4

以下は、C++ で unsigned int を int に変換する効率的で問題のない方法ですか?

#include <limits.h>
void safeConvert(unsigned int passed) 
{
    int variable = static_cast<int>(passed % (INT_MAX+1)); 
    ...
}

それとももっと良い方法がありますか?

アップデート

James McNellis が指摘したように、unsigned int > INT_MAX を整数に割り当てることは未定義ではありません。むしろ、これは実装定義です。そのため、ここでのコンテキストは、unsigned int が INT_MAX を超えたときにこの整数がゼロにリセットされるようにすることを特に好みます。

元のコンテキスト

カウンターとして使用される unsigned int がいくつかありますが、特定のケースではそれらを整数として渡したいと考えています。

通常の操作では、これらのカウントは INT_MAX の範囲内にとどまります。ただし、異常な (しかし有効な) ケースが発生した場合に未定義の実装固有の動作に陥らないようにするために、ここで効率的な変換が必要です。

4

2 に答える 2

7

これも機能するはずです:

int variable = passed & INT_MAX;
于 2011-03-02T02:49:20.473 に答える
0

通常の操作では、これらのカウントは INT_MAX の範囲内にとどまります。ただし、異常な (しかし有効な) ケースが発生した場合に未定義の動作に陥らないようにするために、ここで効率的な変換が必要です。

何への効率的な変換?int と unsigned int のすべての共有値が一致し、INT_MAX + 1 などの他の符号なし値をそれぞれ個別の値にする場合は、それらを負の整数値にのみマップできます。これはデフォルトで行われ、 で明示的に要求できますstatic_cast<int>(my_unsigned)。それ以外の場合は、それらすべてを 0、または -1、または INT_MIN にマップするか、上位ビットを破棄することができます...最も簡単な方法は、単純if (my_unsigned > INT_MAX) my_unsigned = XXXに 、または...my_unsigned &= INT_MAX上位ビットをクリアすることです。intしかし、オーバーフローした場合、呼び出された関数は正しく機能しますか? おそらく、最初から 64 ビットの int を使用するのがより良い解決策でしょうか?

于 2011-03-02T03:07:04.267 に答える