1

次のコード:

UINT32 dword = 4294967295;

if(dword + 1 != 0) // condition

そのような操作では、最大の (全体の) レジスタ (アーキテクチャで利用可能) が常に使用されるという保証はありますか? 以上の条件は、64 ビット モードでは常に true になりますが、32 ビット モードでは false になりますか?

4

1 に答える 1

3

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 ビット に昇格int1れ、 として加算されるintため、結果は 65536 になります。

少なくとも理論的には、UINT32 が符号なしの 32 ビット型 (予想どおり)intであるが 64 ビット型である場合、同じ基本的なことが起こる可能性があります。繰り返しますが、計算を行う前dwordに に昇格さintれるため、計算は 32 ビットではなく 64 ビットの量で行われるため、(再び) 結果は 0 にラップアラウンドしません。

于 2013-04-03T23:12:21.617 に答える