this questionのコードからバイナリを保護する方法はありますか?理想的には、コンパイル時にエラーが発生します。質問からコード例は:符号なしコンテナに負の数を代入しようとするとコンパイルエラーが発生することはありますか?
unsigned int nVal = 0;
nVal = -5; // no error!
this questionのコードからバイナリを保護する方法はありますか?理想的には、コンパイル時にエラーが発生します。質問からコード例は:符号なしコンテナに負の数を代入しようとするとコンパイルエラーが発生することはありますか?
unsigned int nVal = 0;
nVal = -5; // no error!
あなたがG ++を使用している場合は、スイッチ-Wsign-conversion
は変換について警告し、-Werror
はエラーを警告することを行います。
完璧な、ちょうど私が後だった! –
Visual Studioでは、プロジェクトのビルドオプションで「警告をエラーとして扱う」機能を有効にすることもできます。また、コンパイラは、intからunsigned intに変換する際に、データが失われる可能性があるという警告を表示する必要があります。 – Seb
:@ thitonの回答とは別に、
単純な割り当てでは不可能です。ただし、値が小さい場合はを特別なラップ方法に割り当てると役立ちます。すなわち
nVal = -5;
をに置き換える必要があり、
Assign<-5>(nVal);
Assign()
は
template<int VAL>
void Assign (unsigned int &nVal)
{
typedef int arr[(VAL >= 0) 1 : -1];
nVal = VAL;
}
Demo、のように見える場合は、。
実行時に 'compiler error'? *割り当て*は実行時に発生します。 – Nawaz
複雑な変換規則を利用する方法があるかもしれませんが、 'unsigned int'をもう使用しないようにコードを変更することを意味しますが、' EnforcedUnsignedInt'のような他の中間クラスを使用すると、 = '符号付き/符号なし。評決:現実的ではない。 – tenfour
'0u'ではなく' 0'(署名されている)の初期割り当ては、おそらく警告/エラーを生成します。 –