gpt4 book ai didi

c++ - 操作中的整数溢出

转载 作者:行者123 更新时间:2023-11-30 02:56:14 29 4
gpt4 key购买 nike

以下代码:

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

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

关于c++ - 操作中的整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799803/

29 4 0
文章推荐: c++ - Visual Studio 2012 中的智能感知 : No members available for Inner classes in class template?
文章推荐: android - Android 何时为 BLE 调用 BluetoothGattCallback 和 onConnectionStateChange?
文章推荐: java - 使用 openssl 和 -subj 参数在 Java 中生成 CSR
文章推荐: c# mashal const std::list 来自 c++ dll