以下代码:
UINT32 dword = 4294967295;
if(dword + 1 != 0) // condition
在此类操作中是否有保证最大(整体)寄存器(可用于架构)始终使用?以上条件在64位模式下始终为真,而在32位模式下为假?
答案 0 :(得分: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
会涉及unsigned short
和int
(隐含类型1
)之间的数学运算。在这种情况下,dword
实际上会初始化为65535.然后,当您添加时,65535
将被提升为32位int
和1
添加为int
,结果为65536。
至少在理论上,如果UINT32是无符号的32位类型(正如我们所期望的那样),可能会发生同样的基本事情,但int
是64位类型。同样,在进行数学运算之前,dword
将被提升为int
,因此数学将在64位数而不是32位上完成,因此(再次)结果将不会回绕到0