私は 64 ビット (一部の計算用) と 32 ビット (省スペース ストレージ用) の符号なし整数を混合するプログラムに取り組んでいるので、オーバーフローを避けるために演算中にそれらを整理しておくことが非常に重要です。
これが問題の例です
unsigned long n だけ 1 を左にビット シフトしたいのですが、結果を unsigned long long にしたいのです。これは if ステートメントの比較操作で使用されるため、代入は行われません。コードをいくつか紹介します。
void example(unsigned long shift, unsigned long long compare)
{
if((1<<shift)>compare)
{
do_stuff;
}
}
私はこれが私が望むことをしないと思うので、次は私が望むことをしますか?
void example(unsigned long shift, unsigned long long compare)
{
if(((unsigned long long)1<<shift)>compare)
{
do_stuff;
}
}
これらのビット幅を細かく管理するにはどうすればよいですか? 演算が実行されるビット幅を決定するのはどちらのオペランドですか、それとも 2 つのうち大きい方ですか?
また、可能であれば、 + * / % などの他の操作でもこれがどのように機能するかを概説したいと思います.
おそらく、この情報を含むリソースへの参照は良いでしょう。この情報の明確な記述はどこにも見つからないようです。あるいは、投稿するだけの単純なルールかもしれません。私はわかりません。