0

:) 你好,

我已经为此挠头很久了。我只是想将 4294967296 添加到我的负整数(-432 到 +431)我有这个

int temp_int;

    temp_int = ui->SpawnX->value(); //From spinbox
    if(temp_int < 0)
    {
        temp_int = temp_int + 4294967296;
        qDebug() << temp_int;
    }

但无论我尝试什么,temp_int 都保持不变,我仔细检查了 qDebug。我究竟做错了什么!!!?

在我的程序的早期:

 //Get spawn point and fix negative numbers
    temp_hex = level.mid(18+level.indexOf("030006537061776e58"), 8);
    HexToInt(temp_hex, SpawnX);
    temp_hex = level.mid(18+level.indexOf("030006537061776e59"), 8);
    HexToInt(temp_hex, SpawnY);
    temp_hex = level.mid(18+level.indexOf("030006537061776e5a"), 8);
    HexToInt(temp_hex, SpawnZ);
    if(SpawnX > 432)
        SpawnX = SpawnX-4294967296;
    if(SpawnY > 432)
        SpawnY = SpawnY-4294967296;
    if(SpawnZ > 432)
        SpawnZ = SpawnZ-4294967296;

在这种情况下,SpawnX,Y,Z 是 int,范围可以从 0 到 4294967295。

4

1 回答 1

1

您似乎假设将 4294967296 添加到 -432 会给您 +431。

这是不正确的(我想知道你是如何做出这个假设的)。

4294967296 是 2 32。将 2 32添加到 32 位int可能只是环绕并为您提供原始值。实际上有符号整数溢出具有未定义的行为,但常见的实现只是忽略除低位 32 位之外的所有位 - 并且 4294967296 的所有低位 32 位都是 0。十六进制更清楚:4294967296 是 0x100000000,并删除第 33 位位给你0x00000000。

如果你有 -432 而你想要 +431,有多种方法可以做到;最直接的可能就是

temp_int = -temp_int - 1;

更简单的方法是:

temp_int = 431;

但这可能不是你想要的。

如果我们了解您要做什么,这将有所帮助。

在这种情况下,SpawnX,Y,Z 是 int,范围可以从 0 到 4294967295。

如果您想要该范围,则需要使用 32 位无符号类型。如果unsigned int是 32 位,那么它可以表示从 0 到 4294967295 的值。在这种情况下,添加 4294967296环绕并给出原始值;与有符号溢出不同,无符号溢出是明确定义的。

于 2013-07-12T18:58:59.070 回答