以下代码:
UINT32 dword = 4294967295;
if(dword + 1 != 0) // condition
在此类操作中,是否始终使用最大(整个)寄存器(可用于架构)?以上条件在 64 位模式下始终为真,而在 32 位模式下为假?
以下代码:
UINT32 dword = 4294967295;
if(dword + 1 != 0) // condition
在此类操作中,是否始终使用最大(整个)寄存器(可用于架构)?以上条件在 64 位模式下始终为真,而在 32 位模式下为假?
这将取决于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 位类型,则可能会发生相同的基本情况。再次,dword
将int
在进行数学运算之前提升,因此数学运算将在 64 位而不是 32 位上完成,因此(再次)结果不会回绕为 0。