1

以下代码:

UINT32 dword = 4294967295;

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

在此类操作中,是否始终使用最大(整个)寄存器(可用于架构)?以上条件在 64 位模式下始终为真,而在 32 位模式下为假?

4

1 回答 1

3

这将取决于UINT32真正的类型。

如果它是无符号类型(如您所料),则保证结果以可以表示的最大值 + 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 位类型,则可能会发生相同的基本情况。再次,dwordint在进行数学运算之前提升,因此数学运算将在 64 位而不是 32 位上完成,因此(再次)结果不会回绕为 0。

于 2013-04-03T23:12:21.617 回答