操作中的整数溢出

时间:2013-04-03 23:06:00

标签: c++ x86 x86-64 integer-overflow

以下代码:

UINT32 dword = 4294967295;

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

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

1 个答案:

答案 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 shortint(隐含类型1)之间的数学运算。在这种情况下,dword实际上会初始化为65535.然后,当您添加时,65535将被提升为32位int1添加为int,结果为65536。

至少在理论上,如果UINT32是无符号的32位类型(正如我们所期望的那样),可能会发生同样的基本事情,但int是64位类型。同样,在进行数学运算之前,dword将被提升为int,因此数学将在64位数而不是32位上完成,因此(再次)结果将不会回绕到0