次のコード:
UINT32 dword = 4294967295;
if(dword + 1 != 0) // condition
そのような操作では、最大の (全体の) レジスタ (アーキテクチャで利用可能) が常に使用されるという保証はありますか? 以上の条件は、64 ビット モードでは常に true になりますが、32 ビット モードでは false になりますか?
次のコード:
UINT32 dword = 4294967295;
if(dword + 1 != 0) // condition
そのような操作では、最大の (全体の) レジスタ (アーキテクチャで利用可能) が常に使用されるという保証はありますか? 以上の条件は、64 ビット モードでは常に true になりますが、32 ビット モードでは false になりますか?
UINT32
それは、実際にどのようなタイプであるかによって異なります。
それが unsigned 型である場合 (ご想像のとおり)、結果は表現できる最大値 + 1 を法として減らされることが保証されるため、次のようにコーディングします。
if (std::numeric_limits<T>::is_unsigned)
assert(std::numeric_limits<T>::max()+1==0);
...成功するはずです。OTOH は、名前に基づいて、通常、実装やレジスタ サイズなどに関係なく 32 ビット型であると予想されるため、関係なく同じ結果が得られると予想されます。
編集:[申し訳ありませんが、数分間立ち止まって赤ちゃんに授乳しなければなりませんでした]もっと詳しく追加する必要があります. 実際にはありそうにないことは確かに期待UINT32
できますが、実際には (たとえば) 16 ビットunsigned short
. int
議論のために、それが 32 ビットであると仮定しましょう。
この場合、dword+1
は anunsigned short
と an int
(の暗黙の型1
) の間の数学を伴います。その場合、dword
は実際には 65535 に初期化されます。その後、加算を行うと、それ65535
は 32 ビット に昇格int
さ1
れ、 として加算されるint
ため、結果は 65536 になります。
少なくとも理論的には、UINT32 が符号なしの 32 ビット型 (予想どおり)int
であるが 64 ビット型である場合、同じ基本的なことが起こる可能性があります。繰り返しますが、計算を行う前dword
に に昇格さint
れるため、計算は 32 ビットではなく 64 ビットの量で行われるため、(再び) 結果は 0 にラップアラウンドしません。